Mysql パフォーマンスの最適化: インデックス プッシュダウンとは何ですか?
はじめに
ICP と呼ばれるインデックス条件プッシュダウン (インデックス条件プッシュダウン) は、Mysql5.6 バージョンで導入され、クエリを最適化するために使用されます。
ICP を使用せずに、非主キー インデックス (ノーマル インデックスまたはセカンダリ インデックスとも呼ばれます) を使用してクエリを実行すると、ストレージ エンジンはインデックスを通じてデータを取得し、MySQL サーバーに返します。そしてサーバーはデータが条件を満たしているかどうかを判断します。
ICP を使用する場合、特定のインデックス付きカラムに判定条件がある場合、MySQL サーバーはその部分の判定条件をストレージ エンジンに渡し、ストレージ エンジンがインデックスが判定条件を満たすかどうかを判定します。 MySQL サーバーによって渡される条件、インデックスが条件を満たす場合にのみ、データが取得され、MySQL サーバーに返されます。
インデックス条件プッシュダウンの最適化により、ストレージ エンジンが基になるテーブルにクエリを実行する回数が減り、MySQL サーバーがストレージ エンジンからデータを受信する回数も減ります。
[推奨学習: mysql ビデオ チュートリアル ]
开游
開始する前にユーザー テーブルを準備します (ユーザー)、主なフィールドは、ID、名前、年齢、住所です。結合インデックス (名前、年齢) を作成します。
名が Chen であるすべてのユーザーと一致するという要件があるとします。SQL ステートメントは次のとおりです:
SELECT * from user where name like '陈%'
「最も左のプレフィックス」の原則に従って、結合インデックスは次のようになります。ここで使用される (名前、年齢) がクエリされ、パフォーマンスは完全なテーブル スキャンよりも明らかに高くなります。
問題は、他の条件がある場合はどうなるかということです。名が Chen で年齢が 20 歳のユーザーと一致するという別の要件があるとします。このときの SQL ステートメントは次のとおりです。以下は、Mysql5.6 の前後のバージョンの分析です。
Mysql5.6 より前のバージョン5.6 より前のバージョンにはインデックス プッシュダウンの最適化がないため、実行プロセスは次のようになります:
は、年齢フィールドを無視し、名前を通じて直接クエリします。(名前, 年齢) のツリー上に 2 つの結果が見つかります。ID はそれぞれ 2 と 1 で、取得した ID 値は次のとおりです。クエリのためにテーブルに何度も戻るため、このプロセスではテーブルに 2 回戻る必要があります。
Mysql5.6 以降のバージョン5.6 バージョンでは、インデックス プッシュダウンの最適化が追加され、実行プロセスは次のとおりです。
InnoDB は age フィールドを無視しませんが、インデックス内で年齢が 20 に等しいかどうかを判断します。20 に等しくないレコードは直接スキップされるため、(name, age) インデックスでの一致のみが行われます。レコードに到達したら、この ID を取得して主キー インデックス ツリーのテーブルに戻り、すべてのデータをクエリします。このプロセスでテーブルに戻る必要があるのは 1 回だけです。
実践
もちろん、上記の分析は原則にすぎず、実際に分析することができるため、Chen は Mysql5.6 バージョンの Mysql をインストールし、以下に示すように、上記のステートメント:# Explain 解析結果によると、Extra の値がインデックス条件を使用していることがわかります。これは、インデックス プッシュダウンが存在することを意味します。使用されてきました。
概要
非主キー インデックスに対するインデックス プッシュダウンの最適化により、テーブルの戻り数が効果的に削減され、クエリの効率が大幅に向上します。インデックス プッシュダウンをオフにするには、次のコマンドを使用できます。構成ファイルの変更についてはこれ以上説明しません。結局のところ、このような優れた機能をオフにする必要があるのはなぜですか:
SELECT * from user where name like '陈%' and age=20
以上がMySQL インデックス プッシュダウンとは何ですか?最適化に役立ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。