MySQLカバーインデックスの詳しい説明

MySQLカバーインデックスの詳しい説明

コンセプト

インデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング インデックスと呼ばれ、テーブルに戻る必要がないことを意味します。

判断基準

explain を使用する場合は、出力の追加列で判断できます。インデックス カバーリング クエリの場合は、using index と表示されます。MySQL クエリ オプティマイザは、クエリを実行する前に、インデックス カバーリング クエリがあるかどうかを判断します。

知らせ

1. カバーリング インデックスはどのインデックス タイプにも適用できません。インデックスには列の値を格納する必要があります。

2. ハッシュインデックスとフルテキストインデックスは値を保存しないため、MySQLではB-TREEのみを使用できます。

3. ストレージエンジンによってカバーインデックスの実装が異なる

4. すべてのストレージエンジンがサポートしているわけではない

5. カバーリング インデックスを使用する場合は、必要な列を抽出するために SELECT リストの値に注意する必要があります。SELECT * は使用できません。すべてのフィールドをまとめてインデックスすると、インデックス ファイルが大きくなりすぎて、クエリのパフォーマンスが低下するためです。カバーリング インデックスを使用するためだけにこれを行うことはできません。

インデックスにクエリする必要があるすべてのフィールドの値が含まれている(またはカバーしている)場合、そのインデックスは「カバーリング インデックス」と呼ばれます。つまり、テーブルに戻らずにインデックスをスキャンするだけで済みます。

テーブルに戻らずにインデックスのみをスキャンする利点:

1. インデックス エントリは通常、データ行のサイズよりもはるかに小さく、インデックスのみを読み取る必要があるため、MySQL ではデータ アクセスの量が大幅に削減されます。

2. インデックスは列の値の順序で保存されるため、IO 集約型の範囲検索では、ディスクから各データ行をランダムに読み取る場合よりも IO が大幅に少なくなります。

3. MyISAMなどの一部のストレージエンジンは、インデックスをメモリにキャッシュするだけで、データのキャッシュはオペレーティングシステムに依存しているため、データにアクセスするにはシステムコールが必要です。

4. Innodb のクラスター化インデックスとカバーリング インデックスは、Innodb テーブルに特に役立ちます。 (InnoDBのセカンダリインデックスは、行の主キー値をリーフノードに格納するため、セカンダリ主キーでクエリをカバーできる場合は、主キーインデックスのセカンダリクエリを回避できます)

カバーリング インデックスはインデックス列の値を格納する必要がありますが、ハッシュ インデックス、空間インデックス、およびフルテキスト インデックスはインデックス列の値を格納しないため、MySQL ではカバーリング インデックスとして B ツリー インデックスのみを使用できます。

インデックス カバレッジ クエリが開始されると、使用しているインデックスの情報が explain の追加列に表示されます。

カバーインデックスの落とし穴: MySQL クエリ オプティマイザは、クエリを実行する前に、そのクエリをカバーできるインデックスがあるかどうかを判断します。インデックスが where 条件のフィールドをカバーしているが、クエリ全体に含まれるフィールドをカバーしていないと仮定すると、MySQL 5.5 以前のバージョンでは、この行は不要で、最終的にはフィルター処理されるにもかかわらず、テーブルに戻ってデータ行を取得します。

上の図に示すように、カバレッジ クエリは次の理由により使用できません。

1. このインデックスをカバーできるインデックスはありません。クエリはテーブルからすべての列を選択し、すべての列をカバーするインデックスが存在しないためです。

2.MySQL はインデックスに対して LIK 操作を実行できません。 MySQL はインデックス内の左端のプレフィックス一致で LIKE 比較を実行できますが、LIKE クエリがワイルドカードで始まる場合、ストレージ エンジンは比較一致を実行できません。この場合、MySQLは比較のためにインデックス値ではなくデータ行の値のみを抽出できます。

最適化された SQL: インデックス (アーティスト、タイトル、prod_id) を追加し、遅延関連付け (列への遅延アクセス) を使用します。

注: クエリの最初の段階では、カバーリング インデックスを使用して、from 句のサブクエリで一致する prod_id を見つけ、次に外側のレイヤーをクエリして、prod_id 値に基づいて必要なすべての値を一致させて取得することができます。

5.5 では、API 設計により、MySQL はフィルタリング条件をストレージ エンジン レイヤーに渡すことができません (ストレージ エンジンからサーバー レイヤーにデータをプルし、条件に従ってフィルタリングします)。5.6 以降では、ICP 機能によりクエリ実行方法が改善されています。

MySQL がソートにインデックスを使用できない場合、独自のソート アルゴリズム (クイック ソート アルゴリズム) を使用してメモリ (ソート バッファ) 内のデータをソートします。メモリに収まらない場合は、ディスク上のデータをブロックに分割し、各データ ブロックをソートしてから、各ブロックを順序付けられた結果セットにマージします (実際には外部ソート)。

ファイルソートの場合、MySQLには2つのソートアルゴリズムがある。

1. 2つのパス

実装方法は、まずソートするフィールドと、関連する行データを直接見つけることができるポインタ情報を取得し、次に設定されたメモリ(パラメータ sort_buffer_size で設定)内でソートします。ソートが完了したら、行ポインタ情報を通じて必要な列を再度取得します。

注: このアルゴリズムは 4.1 より前に使用されています。データに 2 回アクセスする必要があります。特に、2 回目の読み取り操作では、多数のランダム I/O 操作が発生します。一方、メモリオーバーヘッドは小さい

2. シングルパスアルゴリズム

このアルゴリズムは、必要なすべての列を一度に取り出し、メモリ内で並べ替えて、結果を直接出力します。注: このアルゴリズムは、MySQL 4.1 以降で使用されています。 I/O 操作の回数が減り、効率が向上しますが、大きなメモリ オーバーヘッドも発生します。不要な列を削除すると、ソート処理に必要なメモリが大幅に浪費されます。 MySQL 4.1 以降のバージョンでは、max_length_for_sort_data パラメータを設定することで、MySQL が最初のソート アルゴリズムを選択するか、2 番目のソート アルゴリズムを選択するかを制御できます。取得されたすべての大きなフィールドの合計サイズが max_length_for_sort_data 設定より大きい場合、MySQL は最初のソート アルゴリズムを使用することを選択します。それ以外の場合は、2 番目のソート アルゴリズムを選択します。ソートのパフォーマンスを最大限に向上させるには、当然のことながら 2 番目のソート アルゴリズムを使用することをお勧めします。そのため、クエリでは必要な列のみを取得することが非常に重要です。

結合操作をソートするときに、ORDER BY が最初のテーブルの列のみを参照する場合、MySQL はテーブルに対してファイルソート操作を実行してから結合を実行します。この場合、EXPLAIN は「Using filesort」を出力します。それ以外の場合、MySQL はクエリ結果セット用に一時テーブルを生成し、結合が完了した後にファイルソート操作を実行する必要があります。この場合、EXPLAIN は「Using temporary; Using filesort」を出力します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。
  • MySQLカバーインデックスの使用例
  • MySQLのカバーインデックスに関する知識ポイントのまとめ
  • インデックスとテーブルリターンをカバーするMySQLの使い方
  • MySQL パフォーマンス最適化の事例 - インデックス共有のカバー
  • MySQL パフォーマンス最適化のケーススタディ - インデックスと SQL_NO_CACHE をカバー
  • MySQLカバーインデックスの利点

<<:  Vue カードスタイルのクリックして切り替える画像コンポーネントの使用方法の詳細な説明

>>:  Linux でファイルの権限 (所有権) を変更する

推薦する

ウェブデザインにおけるテキスト入力ボックスのパラメータの説明

一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われています。これは HTML 言...

HTML に FLASH へのリンクを追加し、すべての主要ブラウザと互換性を持たせる方法

まずコードを見てみましょうコードをコピーコードは次のとおりです。 <div style=&qu...

シンプルなメッセージボードケースを実現するJavaScript

参考までに、Javascriptを使用してメッセージボードの例(メッセージ削除あり)を実装します。具...

HTML でスタイルを使用して属性を追加する例

必要なリンクにインライン スタイルを追加します。コードをコピーコードは次のとおりです。 <a ...

GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

需要背景:ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが...

CSSファイルをインポートする3つの方法の詳細な説明

CSS を導入する方法には、インライン スタイル、内部スタイル シート、外部スタイル シートの 3 ...

js タグ構文の使用法の詳細

目次1. ラベルステートメントの紹介2. ラベルステートメントの使用序文:日常の開発では、プログラム...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

Vue のキーボードイベント監視の概要

キー修飾子キーボード イベントをリッスンする場合、詳細なキーを確認する必要があることがよくあります。...

secure_file_priv nullの問題を解決する

secure_file_priv = ' ';管理者としてcmdを実行します。 my...

MySQL パーティション テーブルの基本入門チュートリアル

序文最近のプロジェクトでは、大量のデータを保存する必要があり、このデータには有効期限があります。クエ...

Linux に nodejs 環境とパス構成をインストールするための詳細な手順

Linux に Node.js をインストールする方法は 2 つあります。1 つは簡単で、解凍して使...

メモリ構成が過剰でMySQLが起動できない問題の解決方法

問題の説明MySQL の起動時にエラーが報告されます。エラー ログを確認してください。 [エラー] ...

Vueで背景色と透明度を設定する方法

背景色と透明度の設定上記のように、最初の画像の場合は、灰色の背景と左上隅に白い「カバー」という文字を...

Docker のタイムゾーンの問題とデータ移行の問題

最新のソリューション: -v /usr/share/zoneinfo/Asia/Shanghai:/...