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コマンドは、あまり使用されないデータを定期的にクリーンアップするために使用できます。

推薦する

nginx のインストールが完了した後に PHP を解析できない問題の解決方法

目次方法1方法2 nginxをインストールした後、PHPコードを解析できないことがわかりました。解決...

Vue の 4 つのカスタム命令の説明と使用例

4つの実用的なVueカスタム指示1. Vドラッグ要件: マウスドラッグ要素アイデア:要素のオフセット...

Vueプロジェクトでコンポーネントをカプセル化する簡単な手順

目次序文Toastコンポーネントをカプセル化する方法ユースケース具体的な実装要約する序文ビジネスが発...

HTML印刷関連の操作と実装の詳細な説明

原則的にはwindow.print()メソッドを呼び出すことですが、このメソッドは現在のページ全体を...

Vue で計算プロパティを使用する際の知識ポイントのまとめ

計算されたプロパティ場合によっては、テンプレートにロジックを詰め込みすぎると、テンプレートが重くなり...

MySQL パスワード変更方法の概要

MySQL 5.7 より前のバージョンのパスワードを変更する方法:方法1: SET PASSWORD...

Reactの二次連携を実現する方法

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...

JDBC および MySQL 一時テーブルスペースの詳細な分析

背景一時テーブルスペースは、データベースのソート操作を管理し、一時テーブルや中間ソート結果などの一時...

フローティングメニュー、上下スクロール効果を実現できます

コードはさらに合理化できますが、時間の制約があるため、まずはここで投稿して、自分で最適化してメニュー...

Docker で TLS と CA 認証を有効にする方法

目次1. 証明書を生成する2. リモートを有効にする3. リモート接続3.1 Jenkins接続3....

Vue コンポーネントの構成構造とコンポーネント登録の詳細

目次1. コンポーネントの構成2. コンポーネント名2.1 コンポーネントの命名3. グローバル登録...

HTMLテキスト内のすべてのタグを置き換える方法

(?i) は大文字と小文字を区別しないことを意味します。大文字と小文字をすべて置き換えます。 htm...

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

VSCode 開発 UNI-APP 構成チュートリアルとプラグイン

目次前面に書かれた予防開発環境構築開発構成に関する注意事項前面に書かれたuni-app は、Vue....

CentOS 7 に MySQL 8 をインストールするための詳細なチュートリアル

準備するこの記事の環境情報: ソフトウェアバージョンセントOSセントOS7.4マイグレーション8.0...