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

推薦する

ウェブページの右側に固定されたフローティングレイヤーの実装コード

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

マップタグパラメータの詳細な紹介と使用例

マップ タグはペアで表示する必要があります。 <map> ....</map>...

MySQLのさまざまなロックに関する詳細な理解

目次ロックの概要ロックの分類データベース操作の粒度データ操作の種類MySQL ロックさまざまなストレ...

jQueryはテーブル行データのスクロール効果を実現します

この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...

mysql5.7.14 解凍版インストールグラフィックチュートリアル

MySQL は、コミュニティ エディション (コミュニティ サーバー) とエンタープライズ エディシ...

Javascript における非同期待機の詳細な理解

この記事では、async/await がすべての JavaScript 開発者にとって非同期プログラ...

Dockerコンテナにnginxを簡単にデプロイするプロセスの分析

1. コンテナにnginxサービスをデプロイするcentos:7 イメージはコンテナを実行し、このコ...

フロントエンドJavaScriptのクラス

目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...

Vue + 要素を使用して背景データをオプションに動的に表示する

必要:ハードコードされたデータの代わりに、セレクター内のオプション値の動的な表示を実装します。私のロ...

CSS XTHML の記述標準とよくある問題の概要 (ページ最適化)

プロジェクトドキュメントディレクトリDiv+CSS 命名規則 - 4 - Div+css 命名規則 ...

マウスを傾けた状態でのフリップナビゲーションの問題に関する研究

この記事では、マウス フリップナビゲーションの制作についてまだ疑問を持っている友人の役に立つことを期...

HTML マーキータグの使用例

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルのみをサポートしています。そのため、...

Dockerはdockerfileを使用してnode.jsアプリケーションを起動します

Dockerfileの作成expressによって自動的に作成されたディレクトリを例にとると、ディレク...

MySQLクエリキャッシュに関するヒント

目次序文QueryCache の概要クエリキャッシュ構成QueryCache の使用queryCac...

MySQL 5.7.18 winx64 のインストールと設定方法のグラフィックチュートリアル

圧縮パッケージのインストールは、mysql-5.7 以降、大幅に変更されました。この記事では、mys...