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

推薦する

CentOS 8 に Postfix メール サーバーをインストールして設定する方法

Postfix は、Linux システム上で電子メールをルーティングまたは配信するために使用される無...

ウェブ音楽プレーヤーを実現する js

この記事では、参考までに簡単なHTMLと音楽プレーヤーの制作コードを紹介します。具体的な内容は以下の...

Nginx ローカル ディレクトリ マッピング実装コード例

他のデバイスの画像をローカルディレクトリにマウントするなど、サーバー上の静的リソースにアクセスする必...

MySQL GROUP_CONCAT 制限の解決

効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...

優れたグラフィックデザイナーが習得すべき7つのスキル

1》ウェブデザインが得意であること2》Webページのデザイン方法を知る3》計画する4. SEOを理解...

Windowsにmysql5.7をインストールする方法

まずmysqlの圧縮バージョンをダウンロードします。公式ダウンロードアドレスは123WORDPRES...

中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)

PS: 最近、nginx を詳細に紹介している <<High-Performance ...

nginx rewriteを使用してURLをリダイレクトする方法

最近仕事でnginxの設定を変更する必要が頻繁にあり、nginxでrewriteを使用する方法を学び...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

一般的なDockerコマンドの概要

Dockerのインストール1. 要件: Linuxカーネルバージョン3.10以上 表示: uname...

VMware ESXi 5.5 の展開および構成図のプロセス

目次1. インストール要件2. OSイメージのダウンロード3. VMware Workstation...

IPとポートが接続可能かどうかを検出する方法

Windows コマンドテルネット形式: telnet IP ポート場合: テルネット 191.1....

PostgreSQL マテリアライズドビュープロセス分析

この記事は主にPostgreSQLマテリアライズドビューのプロセス分析について紹介します。サンプルコ...

JavaScript offsetParent のケーススタディ

1. offsetParentの定義: offsetParentは子要素に最も近い位置に配置された親...

Oracle と MySQL の高可用性ソリューションの比較分析

Oracle と MySQL の高可用性ソリューションについては、以前からまとめたいと思っていたので...