この記事では主に Mysql インデックスの最適化方法を共有し、皆様のお役に立てれば幸いです。インデックスは、ストレージ エンジンがレコードを迅速に検索するために使用するデータ構造です。特にテーブル内のデータ量がますます増加する場合、正しいインデックスによってクエリのパフォーマンスが大幅に向上します。しかし、日常業務ではインデックスが無視されたり、誤解されたりすることがよくあります。この記事では、Mysql のインデックス最適化の原則と注意点を簡単に紹介します。
1. インデックスの種類
1) B ツリー インデックス
B ツリー インデックスは最も一般的に使用されるインデックス タイプであり、ほとんどのストレージ エンジンは B ツリー インデックスをサポートしています。
B ツリー自体はデータ構造であり、ディスクまたはその他の直接アクセス補助デバイス用に設計されたバランスの取れた検索ツリーです。 Mysql の B-Tree インデックスは通常、B-Tree のバリアントである B+Tree によって実装されます。その構造は次のとおりです。
B+Tree の特徴は、データが葉ノードに格納され、各葉ノードのデータが同じ順序 (昇順または降順) で格納され、隣接するデータが同じ順序で格納されることです。葉 ノードはすべてポインタを使用して 1 点で接続されており、範囲検索に非常に適しています。
B ツリー インデックスは、ストレージ エンジンが必要なデータを取得するためにテーブル全体のスキャンを実行する必要がなくなり、インデックスのルート ノードからレイヤーごとに検索するため、データへのアクセスを大幅に高速化できます。ストレージ エンジンのサイズを変更してデータ範囲をスキャンするため、クエリ速度が大幅に向上します。
2) ハッシュインデックス
ハッシュインデックスは、名前が示すように、ハッシュテーブルを通じて実装されたインデックスです。その特徴は、インデックスのすべての列と正確に一致する場合にのみ有効であることです。データの各行に対して、ストレージ エンジンはすべてのインデックス列のハッシュ コードを計算し、ハッシュ インデックスはインデックスにハッシュ コードを格納し、ハッシュ テーブルの各データ行へのポインターを保存します。
Mysql では、現在メモリ エンジンのみがハッシュ インデックスを明示的にサポートしており、ハッシュ インデックスは範囲検索、並べ替え、部分的なインデックス列一致検索をサポートしていないため、ハッシュ インデックスが使用されることはほとんどありません。
以下では、B-Tree インデックスの使用法に焦点を当てます。
以下の説明の便宜上、次のフィールドを持つユーザーテーブルがあると仮定します:
id: bigint 型、主キー
name: varchar 型
age: int 型
interest: varchar 型
と、名前、年齢、interest に結合インデックス Index_1 が確立され、インデックスの順序は (名前、年齢、interest) になります。このインデックスの順序は非常に重要であり、後で説明します。
2. B-Tree インデックスの使用法
1) 完全値マッチング
完全値マッチングとは、name='aaa' および age=20 である上記のユーザー テーブルのクエリなど、インデックス内のすべての列とのマッチングを指します。および interest='basketball' はインデックスのすべての列を使用できます。
2) 左端のプレフィックスと一致する
左端のプレフィックスと一致するということは、複数列インデックスの残りの数列のみを使用することを意味します。たとえば、name = 'aaa' である上記のユーザー テーブル クエリの場合、インデックスを使用できますが、インデックスの最初の列のみが使用されます。
3) 列プレフィックスのマッチング
列プレフィックスのマッチングとは、例えば、上記のユーザーテーブルの「aaa%」のような名前をクエリする場合、インデックスを使用できることに注意してください。一致する列の先頭がクエリの名前である場合、インデックスは使用できません。
4) 範囲値のマッチング
たとえば、名前 > 'aaa' と名前 5) 特定の列に完全一致し、別の列に範囲一致します
name='aaa' および age > 10 の上記のユーザー テーブルをクエリする場合、インデックスを使用し、インデックスの最初の 2 列を使用できます。
3. B-Treeインデックスの制限事項
1) インデックスの左端の列から検索を開始しない場合、インデックスは使用できません。
age=20 である上記のユーザー テーブルをクエリする場合、年齢はインデックス列の左端のデータ列ではないため、インデックスは使用できません。
2) インデックス内の列をスキップすることはできません。
name='aaa' および interest='football' である上記のユーザー テーブルをクエリする場合、age 列が where 条件に含まれていないため、インデックスの最初の列のみを使用できます。
関連する推奨事項:
mysql インデックス最適化の使用方法
MySQL Advanced 13 - インデックスによる SQL の最適化
MySQL Order By インデックス最適化方法