まず第一に、次のように左端の一致原則を理解しましょう:
1. まず SQL のクエリ条件を見つけます。同等のもの、どれがスコープの条件です。
2. 等しい値条件を使用してインデックスの左端のフィールドをヒットし、最後に範囲を指定して左から右に順番にフィールドをヒットします。
分析と説明
1. mysql のインデックスはクラスター化インデックスと非クラスター化インデックスに分かれており、mysql のテーブルはクラスター化インデックス構成テーブルです。
クラスタリング ルールは次のとおりです: 主キーがある場合は、主キー インデックスをクラスター化インデックスとして定義します。主キーがない場合は、NULL を許可しない最初の一意のインデックスを選択します。そうでない場合は、 innodb の組み込み ROWID をクラスター化インデックスとして使用します。
(無料の学習ビデオ チュートリアルの推奨: mysql ビデオ チュートリアル)
非クラスター化インデックスは、セカンダリ インデックス、または補助インデックスとも呼ばれます。
2. MySQL のインデックスは、クラスター化インデックスであっても非クラスター化インデックスであっても、B ツリー構造です。クラスター化インデックスのリーフ ノードにはデータが保存され、非クラスター化インデックスのリーフ ノードには非クラスター化インデックスのキーと主キーの値が保存されます。 B ツリーの高さはインデックスの高さになります。
3. インデックスの高さ
クラスター化インデックスの高さによって、主キーに基づいてデータを取得するための理論的な IO 数が決まります。非クラスター化インデックスに基づいてデータを読み取るための理論上の IO 時間は、クラスター化インデックスにアクセスするための合計 IO 時間に追加する必要があります。実際には、それほど多くの IO は必要ないかもしれません。複数の読み取りにより、インデックスのブランチ ノードが配置されているページが mysql メモリにキャッシュされるためです。
mysql のデフォルトのブロック サイズは 16K です。インデックスの高さは、インデックス列の長さに基づいて大まかに見積もることができます。
SQL 最適化は、
SQL ステートメントの where 条件に基づいており、上記の抽出ルールを使用すると、最終的にインデックス キー (最初のキーと最後のキー) に抽出されます。キー)、フィルター間のインデックス、およびテーブル フィルター。
インデックスの最初のキーは、インデックスの開始範囲を見つけるためにのみ使用されるため、最初の検索パスのインデックスを作成する場合にのみ使用されます (インデックス B ツリーのルート ノードに沿って正しいリーフまでトラバースする)インデックスのノード位置) それを使用して一度判断します;
インデックスの最後のキーは、インデックスの終了範囲を見つけるために使用されます。したがって、開始範囲の後に読み取られるインデックス レコードごとに、インデックスの最終キーを超えています。範囲を超えた場合、現在のクエリは終了します。
インデックス フィルタは、クエリ条件を満たさないインデックス クエリ範囲内のレコードをフィルタリングするために使用されます。したがって、インデックス範囲はインデックス フィルターと比較する必要があります。インデックス フィルターに一致しない場合は、直接破棄され、インデックス内の次のレコードの読み取りが続行されます。
テーブル フィルター、これが最後のレコードです。前回のインデックス テストに合格したレコードをフィルターするために使用される where 条件の防御線。この時点のレコードは、インデックスの最初のキーとインデックスの最後のキーで形成される範囲を満たし、インデックス フィルターの条件を満たしています。完全なレコードがテーブルに読み戻され、完全なレコードがテーブル フィルターのクエリ条件を満たしているかどうかが判断されます。同様に、満たされていない場合は、現在のレコードをスキップし、インデックス内の次のレコードの読み取りを続けます。満たされている場合は、レコードを返します。このレコードはすべての条件を満たしており、フロントエンド ユーザーに返すことができます。
分析
SQL ステートメントはどのようなプロセスを経る必要があるか処刑されるのか?
SQL ステートメントがクエリのために mysql データベースに送信されるときは、次の手順を実行する必要があります:
1. まず、where 解析ステップで、現在のクエリ条件を解析します。クエリ ステートメントはそれぞれ独立した条件単位に分解されます;
2. Mysql は SQL を自動的に分割して再編成します;
3. その後、where 条件が B ツリー インデックスでインデックス マッチングを実行しますインデックスがヒットすると、指定されたテーブル レコードの場所が特定されます。ヒットがない場合は、すべてのスキャンのみを使用できます;
4. 現在のクエリ フィールドに基づいて、対応するデータ値を返します。
以下に示すように:
推奨される関連記事とチュートリアル: mysql チュートリアル
以上がmysqlインデックスヒットルールの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。