MySQL インデックス プッシュダウンの詳細

MySQL インデックス プッシュダウンの詳細

序文:

インデックス プッシュダウン (ICP) は、MySQL がインデックスを使用してテーブルから行を取得する状況に対する最適化です。

  • インデックス プッシュダウンがない場合、MySQL はストレージ エンジンを使用してインデックスをトラバースし、テーブル内のデータ行を見つけて MySQL サーバーに返します。次に、サーバーは WHERE 条件を決定して、データ行を結果セットに追加するかどうかを確認します。
  • インデックス プッシュダウンが有効になっていて、WHERE 条件の一部をインデックス内の列のみを使用して評価できる場合、MySQL サーバーは WHERE 条件のこの部分をストレージ エンジンにプッシュします。ストレージ エンジンは、インデックス エントリを使用してプッシュされたインデックス条件を評価し、条件が満たされた場合にのみテーブルから読み取ります。

インデックス プッシュダウンにより、ストレージ エンジンがデータ テーブルにアクセスする回数と、MySQL サーバーがストレージ エンジンにアクセスする回数を削減できます。

まだ少し混乱していますか?その通りです。上記の段落は確かに理解するのがかなり難しいですが、落胆しないでください。最もわかりやすい言葉を使って、インデックス プッシュダウンを理解する方法を説明します。

要約すると:

  • 左端接頭辞原則
  • 表に戻る

1. 左端接頭辞原則

MySQL 、結合インデックスを確立するときに、最左接頭辞の原則に従います。たとえば、User テーブルには結合インデックス (id、name、age) が確立されます。最左接頭辞の原則によると、この結合インデックスは、SQL の条件部分が (id)、(id、name)、または ( idnameage ) に一致する場合にのみ使用できます。

インデックスは次の状況で使用できます。

SELECT * FROM USER WHERE id = 1

SELECT * FROM USER WHERE id = 1 かつ name = 'zhangsan'

SELECT * FROM USER WHERE id = 1、name = 'zhangsan'、age = 18 の場合

次の状況ではインデックスは使用できません。

SELECT * FROM USER WHERE name = 'zhangsan'

SELECT * FROM USER WHERE age = 18

SELECT * FROM USER WHERE name = 'zhangsan'、age = 18 の場合

結合インデックスの場合、 mysql範囲クエリ (>、<、 betweenlike ) に遭遇して一致を停止するまで、右方向への一致処理を続けます。

2. 表に戻る

MySQLInnoDBエンジンで 2 種類のインデックスをサポートしています。

  • クラスター化インデックス:インデックス (B+ ツリーのリーフ ノード上) はデータ行 (実データ) を格納します。
  • 通常のインデックス:主キーはインデックスに格納されます (B+ ツリーのリーフ ノード上)

ここではクラスター化インデックスに焦点を当てます。公式ドキュメントには次のように説明されています。

  • InnoDB 、主キーを持つテーブルのクラスター化インデックスとして主キーを使用します。
  • 主キーのないテーブルの場合、 InnoDB最初の一意のインデックスをクラスター化インデックスとして使用します。
  • 主キーまたは一意のインデックスがない場合、MySQL はクラスター化インデックスとして非表示の 6 バイトrow IDフィールドを生成します。

MySQL通常のインデックスを通じて一度にすべてのデータを取得できない場合、通常のインデックスを通じて主キー値を取得し、主キー値を通じてクラスター化インデックス内のレコードを検索します。このプロセスはテーブル取得と呼ばれます。カバリングインデックスを作成することで、テーブルを返す回数を減らすことができます。たとえば、ID番号で名前を検索する場合、ID番号と名前の結合インデックス( idname )を作成できます。クエリを実行すると、このインデックスを通じてnameの値を直接取得でき、クラスター化インデックスで検索する必要がなくなります。これがカバリングインデックスです。

3. インデックスプッシュダウン

まずユーザーテーブルを作成する

テーブル「学生」を作成(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) デフォルト NULL,
  `age` int デフォルト 0,
  `class` varchar(255) デフォルト NULL,
  主キー (`id`)、
  キー `index_two` (`name`,`age`)
)ENGINE=InnoDB;

//このテーブルに複合インデックス (`name`,`age`) を追加します

テーブルにデータを挿入する

`student` (`name`, `age`, `class`) に VALUES ('pengpeng', 21, '1') を挿入します。
`student` (`name`, `age`, `class`) に VALUES ('pengpeng', 22, '2') を挿入します。
`student` (`name`, `age`, `class`) に VALUES ('pengpeng', 23, '3') を挿入します。
`student` (`name`, `age`, `class`) に VALUES ('pengpeng', 24, '4') を挿入します。
`student` (`name`, `age`, `class`) に VALUES ('pengpeng', 25, '5') を挿入します。


クエリによって挿入されたデータは次のとおりです

次に次のSQLを説明します

説明: select * from student where name like 'peng%' and age = 23;


Extra フィールドに USING INDEX CONDITION と表示されていることがわかります。これは、この SQL がインデックス プッシュダウンを使用していることを示しています。上記の SQL ステートメントを分析してみましょう。

MySQL 5.6 より前では、名前フィールドから条件を満たす行のみを検索し、テーブルに戻ってクラスター化インデックスのデータ行を検索し、年齢フィールドを比較して、条件に該当するデータを結果セットに追加することしかできませんでした。

インデックス プッシュダウン最適化は、MySQL 5.6 で導入されました。インデックス トラバーサル プロセス中に、インデックスに含まれるフィールドが最初に判断されます。ここでは、age フィールドが判断されます。年齢フィールドの要件を満たさないデータ行を直接除外することで、テーブルから返される値の数を減らします。

質疑応答エリア

質問 1:複合インデックス列が (名前、年齢、住所) の場合、次の SQL でインデックスを使用できますか?

名前が 'peng%' で、年齢が 23 である学生から * を選択します。


はい、like に遭遇すると後続の要素のマッチングが中断されますが、使用できるのは name フィールドのみです。MySQL は範囲クエリ (>、<、between、like) に遭遇してマッチングを停止するまで、右側へのマッチングを続けます。範囲列ではインデックスを使用できますが、範囲列に続く列ではインデックスを使用できません。つまり、インデックスは最大 1 つの範囲列に使用されるため、クエリ条件に 2 つの範囲列がある場合、インデックスを完全に使用することはできません。

質問 2:インデックス プッシュダウンは、結合インデックスにのみ存在できますか?

はい、非結合インデックスではインデックス プッシュダウンは不可能です。

質問 3:どのような状況でインデックス プッシュダウンを使用できないのでしょうか?

プッシュダウン条件がサブクエリに遭遇しました

押し下げ条件遭遇機能

非 InnoDB テーブルと MyISAM テーブル

質問 4 : インデックス プッシュダウンをオン/オフにするにはどうすればいいですか?

// インデックスプッシュダウンはデフォルトで有効になっています。set optimizer_switch='index_condition_pushdown=off'; // 無効にする set optimizer_switch='index_condition_pushdown=on'; // 有効にする

要約する

非主キー インデックスのインデックス プッシュダウンの最適化により、テーブル リターンの数を効果的に削減し、クエリの効率を大幅に向上できます。日常業務では、インデックス プッシュダウンを使用して、ビジネス状況に応じてインデックスを最適化し、ビジネス スループットを向上させることができます。

これで、MySQL インデックス プッシュダウンに関する詳細な記事は終了です。MySQL インデックス プッシュダウンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL インデックス データ構造の詳細な分析
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • MySQLはインデックスプッシュダウンを数秒で理解するのに役立ちます
  • MySQL インデックス プッシュダウンを 5 分で理解する
  • MySQL Index Pushdown (ICP) とは何かを理解するための記事
  • MySQL 面接の質問: ハッシュ インデックスの設定方法

<<:  CSSはBEM命名規則の実践を使用する

>>:  CSS の優先順位に関する詳細な紹介

推薦する

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

MySQLエラー10061を解決する方法

この記事では、「'localhost' (10061) の MySQL サーバーに接...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

nginx のロードバランシングとリバースプロキシの説明

目次負荷分散負荷分散分類1. DNS 負荷分散2. IP負荷分散3. リンク層の負荷分散4. ハイブ...

WeChatアプレットが左右連携を実現

この記事では、WeChatアプレットの左右連動を実現するための具体的なコードを参考までに紹介します。...

Docker の win ping 失敗コンテナ回避ガイド

win docker-desktopを使ってコンテナ開発に接続し、ネットワーク上で色々試してみたいと...

Linuxアカウントファイル制御管理の詳細な手順

Linux システムでは、ユーザーが手動で作成したさまざまなアカウントに加えて、システムまたはプログ...

MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

UNION演算子の使用union : 2 つ以上の SELECT ステートメントの結果を 1 つの...

クリックして展開し、全文を読む機能を実現する純粋なCSS

注記記事表示リストインターフェースを開発する場合、情報の基本的な概要を提供するために記事ヘッダーコン...

vue3 プロジェクトを素早く構築し、関連機能を紹介する vite+ts の詳細な説明

目次ヴィテ建てる構成vite.config.tsルーターtsタイプvue3 の知識設定小道具コンテク...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

ファイルをアップロードするための HTML フォームの「参照」ボタンを変更する方法

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

Linux でのログ サーバーの設定に関するグラフィック チュートリアル

序文この記事では、Linux 構成ログ サーバーに関する関連コンテンツを主に紹介し、参考と学習のため...

Windows Server 2019 IIS10.0+PHP(FastCGI)+MySQL 環境構築チュートリアル

準備1. 環境の説明:オペレーティング システム: Windows Server 2019 PHP ...