MySQLのカバーインデックスに関する知識ポイントのまとめ

MySQLのカバーインデックスに関する知識ポイントのまとめ

インデックスにクエリする必要があるすべてのフィールドの値が含まれている(またはカバーしている)場合、そのインデックスは「カバーリング インデックス」と呼ばれます。

カバーリング インデックスは、クエリのパフォーマンスを大幅に向上できる非常に強力なツールです。データを読み取るのではなく、インデックスを読み取るだけで済みます。次の利点があります。

1. インデックス エントリは通常レコードよりも小さいため、MySQL がアクセスするデータも少なくなります。

2. インデックスは値のサイズによって保存されるため、ランダム アクセス レコードよりも I/O が少なくなります。

3. データ エンジンはインデックスをより適切にキャッシュできます。たとえば、MyISAM はインデックスのみをキャッシュします。

4. InnoDB はクラスター化インデックスを使用してデータを整理するため、カバーリング インデックスは InnoDB に特に役立ちます。クエリに必要なデータがセカンダリ インデックスに含まれている場合は、クラスター化インデックスで検索する必要はありません。

制限:

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

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

3. ストレージ エンジンによってカバーリング インデックスの実装方法は異なり、すべてのストレージ エンジンがカバーリング インデックスをサポートしているわけではありません。

4. カバーリング インデックスを使用する場合は、SELECT リスト値から必要な列を必ず選択してください。SELECT * は使用しないでください。すべてのフィールドをまとめてインデックスすると、インデックス ファイルが大きくなりすぎて、クエリのパフォーマンスが低下します。

知識ポイントの拡張:

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」を出力します。

上記は、MySQL のカバーリングインデックスに関するナレッジポイントのまとめの詳細内容です。MySQL のカバーリングインデックスとは何かについての詳細は、123WORDPRESS.COM の他の関連記事にも注目してください。

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

<<:  ubuntu20.04 LTS システムのデフォルト ソース ソース リスト ファイルの変更

>>:  画像拡大鏡効果のJSバージョン

推薦する

JavaScript Domはカルーセルの原理と例を実装します

カルーセルを作りたい場合、まずその原理を理解する必要があります。画像を右から左にスライドさせるにはど...

Vue での weixin-js-sdk の一般的な使用方法の詳細な説明

リンク: https://qydev.weixin.qq.com/wiki/index.php?ti...

MySQLカスタム関数の簡単な使用例

この記事では、例を使用して MySQL カスタム関数の使用方法を説明します。ご参考までに、詳細は以下...

VueはEChartsを使用して折れ線グラフと円グラフを実装します

バックエンド管理プロジェクトを開発する場合、バックエンドのユーザーデータをカウントし、折れ線グラフや...

openlayers6 マップオーバーレイの一般的な 3 つの用途 (ポップアップウィンドウマーカーテキスト)

目次1. 前に書く2. ポップアップウィンドウを実装するためのオーバーレイ2.1 vueページのad...

ウェブサイト制作におけるオンライン広告の新しいインタラクティブ体験(グラフィックチュートリアル)

インターネット時代が成熟するにつれて、オンライン広告の発展も加速しています。圧倒的な広告収入と完璧な...

CSS を使用して fullpage.js のフルスクリーン スクロール効果を実装するサンプル コード

最近 CSS を勉強していたとき、 2 つの CSS プロパティだけを使用して全画面スクロール効果を...

MYSQL サブクエリとネストされたクエリの最適化例の分析

ゲーム史上最高スコアトップ100をチェックSQLコード cdb_playsgame ps から ps...

Linux で MySQL 8.0 バージョンをアンインストールする方法

1. MySQLをシャットダウンする [root@localhost /]# サービスmysqldを...

Docker Tomcat のアクセス インターフェイスが表示されないのはなぜですか?

質問:オリジン サーバーはターゲット リソースの表現を見つけることができないか、既存の表現を公開した...

ファイル書き込みを使用して Linux アプリケーションをデバッグする方法

Linux ではすべてがファイルなので、Android システム自体は Linux + Java だ...

HTML マルチヘッダーテーブルコード

1. マルチヘッダーテーブルコードコードをコピーコードは次のとおりです。 <!DOCTYPE ...

Windows 10 Home Edition に Docker for Windows をインストールする

0. 背景ハードウェア: Xiaomi Notebook Air 13/Inter Core i7-...

MySQL のデッドロックとデータベースおよびテーブル シャーディングの問題の詳細な説明

MySQL 運用上の問題点を記録します。ビジネスシナリオと問題の説明外部インターフェースをリクエスト...

MySQL5.6.17データベースをインストールするときにMy.iniファイルを構成する方法

最近、プロジェクトの開発時に MySql データベースを使用しました。MySql に関する記事をいく...