MySQLの通常インデックスとユニークインデックスの違いを詳しく解説
この記事では、MySQL の通常のインデックスと一意のインデックスの違いについて紹介します。非常に詳しく説明されているので、MySQL を学習している友人の参考になれば幸いです。
#MySQL における通常のインデックスと一意のインデックスの違いの詳細な説明
1. クエリとクエリの違いupdate
これら 2 種類のインデックスの間でクエリ機能に違いはありません。主に考慮すべき点は、更新パフォーマンスへの影響です。できるだけ通常のインデックスを選択することをお勧めします。
(無料の学習ビデオ チュートリアルの推奨: mysql ビデオ チュートリアル)
1.1 MySQL クエリ操作
■ 普通Index
条件を満たす最初のレコードを見つけたら、条件を満たさない最初のレコードが見つかるまで逆方向のトラバースを続けます。
#一意のインデックス
インデックスは一意性を定義するため、条件を満たす最初のレコードが見つかった後、検索は直接停止されます。
通常のインデックスはもう一度取得されますが、ほとんど影響はありません。 InnoDB データはデータ ページ単位で読み書きされるため、データを読み取る必要がある場合、レコードはディスクから直接読み取られるのではなく、まずデータ ページがメモリに読み込まれ、次にデータ ページから取得されます。
データ ページのデフォルトは 16 KB です。整数フィールドの場合、データ ページにはほぼ 1,000 個のキーを保持できます。読み取るデータがデータ ページの最後のレコードにない限り、別のデータ ページをこのような状況はまれであり、CPU の消費は基本的に無視できます。
したがって、データのクエリという点では、通常のインデックスと一意のインデックスに違いはありません。
1.2 MySQL 更新操作
更新操作はディスク内のデータを直接更新するのではなく、まずデータ ページをディスクからメモリに読み取ってから更新します。データのページ。
## 通常のインデックス
# データ ページをディスクからメモリに読み取り、データ ページを更新します。 ## 一意のインデックス# データ ページをディスクからメモリに読み取り、一意であるかどうかを判断して、データ ページを更新します。
MySQL には変更バッファ機構があるため、通常のインデックスと一意のインデックスの更新には一定の違いが生じます。
変更バッファの機能は、IO 操作を削減し、過度のシステム負荷を回避することです。変更バッファ内のデータ ページにデータを書き込むプロセスはマージと呼ばれます。
更新する必要のあるデータ ページがメモリ内にある場合は、データ ページが直接更新されますが、データがメモリ内にない場合は、更新操作が最初に変更バッファに記録されます。次回データ ページが読み取られると、データ ページにマージされます。 データ ページでは、変更バッファにも通常のマージ戦略があります。マージはデータベースの通常のシャットダウン中にもトリガーされます。
一意のインデックスの場合、更新する前にデータが一意であるかどうかを判断する必要があります (テーブル内のデータで同じことを繰り返すことはできません)。データ ページがメモリ内にある場合は、直接判断して更新できます。メモリにない場合は、ディスクに移動して読み取って、一意であるかどうかを確認し、一意である場合は更新します。変更バッファは使用されません。データ ページがメモリにない場合でも、データ ページを読み取る必要があります。
変更バッファはバッファ プール内のメモリを使用するため、無限に増やすことはできません。変更バッファのサイズは、パラメータ innodb_change_buffer_max_size を通じて動的に設定できます。このパラメータが 50 に設定されている場合、変更バッファのサイズはバッファ プールの最大 50% までしか占有することができないことを意味します。
結論: 変更バッファは一意のインデックスには使用できません。使用できるのは通常のインデックスのみです。2. 変更バッファと REDO ログの違い
2.1 変更バッファの適用可能なシナリオ
変更バッファ 更新操作やキャッシュ更新操作の頻度を減らす機能です。これには、更新が適時に行われないという欠点があり、読み取り操作が頻繁に行われるテーブルの場合、変更バッファーの使用はお勧めできません。
更新操作が変更バッファに記録されたばかりであるため、テーブルが読み取られ、データ ページがメモリに読み込まれ、データはすぐにデータ ページにマージされました。これではパフォーマンスの消費が減らないだけでなく、変更バッファを維持するコストも増加します。
書き込みが多く読み取りが少ないテーブルに適しています。
2.2 変更バッファと REDO ログの違いREDO ログと変更バッファを理解するために例を示します。次の SQL ステートメントを実行します。
mysql> insert into t(id,k) values(id1,k1),(id2,k2);
(id1,k1) がデータ ページ ページ 1 にあり、(id2,k2) がデータ ページ ページ 2 にあるとします。そして、ページ 1 はメモリ内にありますが、ページ 2 はメモリ内にありません。
実行プロセスは次のとおりです:
ページ 1 に (id1,k1) を直接書き込みます;
変更内容に「ページ 2 に (id2) を書き込みます」と書き込みます。バッファ ,k2)"このメッセージ;
上記の 2 つのアクションを REDO ログに記録します。
上記を完了すると取引が完了します。この更新ステートメントの実行コストは非常に低く、2 つのメモリに書き込んでからディスクに書き込み (2 つの操作を合わせて 1 つのディスクに書き込みます)、それらは順次書き込まれます。
この更新ステートメントには、メモリー、REDO ログ (ib_log_fileX)、データ表スペース (t.ibd)、およびシステム表スペース (ibdata1) の 4 つの部分が含まれます。
如果要读数据的话,过程是怎样的?
mysql> select * from t where k in (k1, k2);
假设读操作在更新后不久,此时内存中还有 Page 1,没有 Page 2,那么读操作就和 redo log 以及 ibdata1 无关了。
从内存中获取到 Page 1 上的最新数据 (id1,k1);
将数据页 Page 2 读入内存,执行merge 操作,此时内存中的 Page 2 也有最新数据(id2,k2);
需要注意的是:
redo log中的数据,可能还没有 flush 到磁盘,磁盘中的 Page 1 和 Page 2 中并没有最新数据,但我们依然可以拿到最新数据(内存中的 Page 1 就是最新的,Page 2 虽然不是最新的,但是从磁盘读到内存中后,执行了merge操作,内存中的 Page 2 就是最新的了。)
如果此时 MySQL 异常宕机了,比如服务器异常掉电,change buffer 中的数据会不会丢?
change buffer 中的数据分为两部分,一部分是已经merge到ibdata1中的数据,这部分数据已经持久化,不会丢失。另一部分数据,还在 change buffer 中,没有merge 到ibdata1,分 3 种情况:
(1)change buffer 写入数据到内存,redo log 也已经写入(ib-log-filex),但是未 commit,binlog中也没有fsync到磁盘,这部分数据会丢失;
(2)change buffer 写入数据到内存,redo log 也已经写入(ib-log-filex),但是未 commit,binlog 已写入到磁盘,这部分不会多丢失,异常重启后会先从 binlog 恢复 redo log,再从 redo log 恢复 change buffer;
(3)change buffer 写入数据到内存,redo log 和 binlog 都已经fsync,直接从redo log 恢复,不会丢失。
redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗
更多MySQL相关教程,请关注PHP中文网!
以上がMySQLの通常インデックスとユニークインデックスの違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

NAVICAT自体はデータベースパスワードを保存せず、暗号化されたパスワードのみを取得できます。解決策:1。パスワードマネージャーを確認します。 2。NAVICATの「パスワードを記憶する」機能を確認します。 3.データベースパスワードをリセットします。 4.データベース管理者に連絡してください。

リモート接続とローカル接続は、ネットワーク上のデータベースに異なります。リモート接続はインターネット上のリモートサーバー上のデータベースにアクセスし、ローカル接続はローカルコンピューターに保存されているデータベースに直接アクセスします。

次のコマンドでmysqlデータベースを表示します。サーバーに接続します:mysql -u username -pパスワードrun showデータベース。すべての既存のデータベースを取得するコマンド[データベース]を選択します。データベース名を使用します。テーブルを表示:表を表示します。テーブル構造を表示:テーブル名を説明してください。データを表示:[テーブル名]から[ *]を選択します。

Passwordが暗号化された形式で保存されているため、MariadbのNavicatはデータベースパスワードを直接表示できません。データベースのセキュリティを確保するには、パスワードをリセットするには3つの方法があります。NAVICATを介してパスワードをリセットし、複雑なパスワードを設定します。構成ファイルを表示します(推奨されていない、高リスク)。システムコマンドラインツールを使用します(推奨されません。コマンドラインツールに習熟する必要があります)。

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQLのコピーと貼り付けには、次の手順が含まれています。データを選択し、Ctrl C(Windows)またはCMD C(MAC)でコピーします。ターゲットの場所を右クリックして、貼り付けまたはCTRL V(Windows)またはCMD V(MAC)を使用します。コピーされたデータは、ターゲットの場所に挿入されるか、既存のデータを置き換えます(データが既にターゲットの場所に存在するかどうかに応じて)。

MySQLでテーブルをコピーするには、新しいテーブルの作成、データの挿入、外部キーの設定、インデックスのコピー、トリガー、ストアドプロシージャ、および機能が必要です。特定の手順には、同じ構造を持つ新しいテーブルの作成が含まれます。元のテーブルからデータを新しいテーブルに挿入します。同じ外部キーの制約を設定します(元のテーブルに1つがある場合)。同じインデックスを作成します。同じトリガーを作成します(元のテーブルに1つがある場合)。同じストアドプロシージャまたは関数を作成します(元のテーブルが使用されている場合)。
