MySQL インデックス プッシュダウン (ICP) の簡単な理解と例

MySQL インデックス プッシュダウン (ICP) の簡単な理解と例

序文

Index Condition Pushdown (ICP) は、MySQL 5.6 の新機能です。テーブルクエリの数を減らし、検索効率を向上させることができます。

MySQL アーキテクチャ

インデックス プッシュダウンを理解するには、まず MySQL のアーキテクチャを理解する必要があります。

上記の画像は公式 MySQL ドキュメントからの抜粋です。

MySQL は通常、上から下に向かって次のレイヤーに分かれています。

  • MySQL サービス レイヤー: NoSQL および SQL インターフェイス、クエリ パーサー、オプティマイザー、キャッシュ、バッファー、その他のコンポーネントが含まれます。
  • ストレージ エンジン レイヤー: トランザクションやインデックスなどのさまざまなストレージ エンジン関連の機能を実装するさまざまなプラグイン テーブル ストレージ エンジン。
  • ファイル システム層: 物理ファイルの読み取りと書き込み。

MySQL サービス レイヤーは、SQL 構文の解析、トリガー、ビュー、組み込み関数、binlog、実行プランの生成などを担当し、ストレージ エンジン レイヤーを呼び出してデータの保存と取得を実行します。 「インデックス プッシュ ダウン」の「ダウン」は、実際には、上位層 (サービス層) が担当するタスクの一部が、処理のために下位層 (ストレージ エンジン) に引き渡されることを意味します。

インデックスプッシュダウンの例

ユーザー テーブルのデータと構造が次のとおりであると仮定します。

id誕生日名前
1 18 01-01ユーザー1
2 19 03-01ユーザー2
3 20 03-01ユーザー3
4 21 03-01ユーザー4
5 22 05-01ユーザー5
6 18 06-01ユーザー6
7 24 01-01ユーザー7

結合インデックス (年齢、誕生日) を作成し、年齢が 20 歳を超え、誕生日が 03-01 であるユーザーをクエリします。

年齢が20歳を超え、誕生日が「03-01」であるユーザーから*を選択します。

年齢フィールドは範囲クエリを使用するため、最左プレフィックスの原則に従って、この場合、範囲クエリに使用できるのは年齢フィールドのみであり、インデックス内の誕生日フィールドは使用できません。実行プランを表示するには、explain を使用します。

+------+-------------+-------+-------+---------------+--------------+--------+------+------+-----------------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+------+-------------+-------+-------+---------------+--------------+--------+------+------+-----------------------+
| 1 | SIMPLE | ユーザー | 範囲 | age_birthday | age_birthday | 4 | NULL | 3 | インデックス条件を使用 |
+------+-------------+-------+-------+---------------+--------------+--------+------+------+-----------------------+

age_birthday インデックスが使用されているにもかかわらず、インデックスの長さ key_len が 4 しかないことがわかります。これは、結合インデックスの age フィールドのみが有効であることを意味します (age フィールドは int 型であり、4 バイトを占めるため)。最後に、「Extra」列の「Using index」条件は、このクエリがインデックス プッシュダウン最適化を使用することを示します。

インデックス プッシュダウンなしで次の手順を実行します。

  • ストレージエンジンは、インデックスに従って年齢が20を超えるユーザーID(4、5、7)を検索します。
  • ストレージ エンジンは、テーブルから ID が (4,5,7) の 3 つのレコードを取得し、サービス レイヤーに返します。
  • サービス レイヤーは、birthday="03-01" 条件を満たさないレコードをフィルター処理し、最終的に id=4 のレコードの行をクエリ結果として返します。

インデックス プッシュダウン最適化が有効になっている場合、実行手順は次のようになります。

  1. ストレージ エンジンは、インデックスに従って age>20 のユーザー ID を検索し、インデックスの birthday フィールドを使用して birthday="03-01" 条件を満たさないレコードをフィルター処理し、最終的に id=4 を取得します。
  2. ストレージ エンジンは、テーブルから id=4 のレコードを取得し、それをサービス レイヤーに返します。
  3. サービス レイヤーは、birthday="03-01" 条件を満たさないレコードをフィルター処理し、最終的に id=4 のレコードの行をクエリ結果として返します。

インデックス プッシュダウンを有効にすると、where 条件は MySQL サービス レイヤーからストレージ エンジン レイヤーに移動されて実行されます。利点は、ストレージ エンジンが ID に基づいてテーブルからデータを読み取る頻度が少なくなることです。上記の例では、インデックス プッシュダウンがない場合、テーブルをさらに 2 回クエリする必要があります。さらに、テーブル クエリは個別の IO になる可能性が高く、場合によってはデータベースのパフォーマンスが大幅に向上する可能性があります。

要約する

これで、MySQL Index Pushdown (ICP) の簡単な理解と例に関するこの記事は終了です。MySQL Index Pushdown (ICP) に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL インデックス プッシュダウンを 5 分で理解する
  • MySQL Index Pushdown (ICP) とは何かを理解するための記事
  • MySQL インデックス プッシュダウンを 5 分で学ぶ
  • MySQLはインデックスプッシュダウンを数秒で理解するのに役立ちます

<<:  CSS3入力ボックスの実装コードはGoogleログインのアニメーション効果に似ています

>>:  docker pruneコマンドは、あまり使用されないデータを定期的にクリーンアップするために使用できます。

推薦する

Lvs+Nginx クラスターを使用して高並列アーキテクチャを構築する例

目次1. Lvsの紹介2. Lvs負荷分散モード2.1 NAT 2.2 ターン2.3 DRモード3....

Raspberry Pi 4 に Ubuntu 19.10 をインストールするための詳細なチュートリアル

以前、raspbian で実行したときに opencv の一部の依存関係をパッケージ化できず、一部の...

CSS でフッターの「下部吸収」効果を実現

よく遭遇する問題: 下部の要素を「下部に貼り付ける」効果を CSS でどのように実現するか。この記事...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

見落とされがちなMETAタグの特殊効果(ページ遷移効果)

Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...

Dockerでイメージをプルするための手順を完了する

1. Docker pullはイメージをプルします$ docker pull {IMAGE_NAME...

JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明

目次1. JavaScript がシングルスレッドなのはなぜですか? 2. タスクキュー3. イベン...

Linux で binlog ファイルの作成時間を表示するコマンド

目次背景分析する方法背景MySQL は 26 日の 16:23:49 に大量のスロー クエリを生成し...

MySQL マスタースレーブスイッチチャネルの問題の解決策

VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...

幅の比率に応じて高さを変えるCSSを実装するいくつかの方法

[解決策1: パディングの実装]原理:要素の padding の値がパーセンテージの場合、このパーセ...

HTML における画像タグの使用方法の詳細な説明

HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...

追加、削除、変更、クエリを実行するための JS 操作オブジェクト配列のサンプルコード

1. はじめに最近、私は友人が JSON 配列を追加、削除、変更するための簡単なページを作成するのを...

Docker-compose におけるdepends_on 順序問題を解決する方法についての簡単な説明

コンテナをソートするためにdepends_onを使用しても、コンテナ間の依存関係の問題は完全には解決...

HTMLタグを閉じるのを忘れないでください

Web 標準に準拠した Web ページの構築は、jb51.net が常に全員と議論しているトピックで...

高品質なJavaScriptコードの書き方

目次1. 読みやすいコード1. 統一コード形式2. マジックナンバーを削除する3. 単一機能原則2....