誰もがこの書き込みは大丈夫だと思っています。いいね、ブックマーク、注目してください。また、私の個人的なブログ
にアクセスすることもできます。これは、近年更新されると推定されています。私と友達になりましょう!https://motongxue.cn
記事ディレクトリ
インデックス条件のプッシュダウンの最適化
概要
インデックス コンディション プッシュダウン (略して ICP) は、MySQL がインデックスを使用してテーブルから行を取得する状況の最適化です。また、Mysql5.6 のバージョンで起動されました。MySQL は、インデックスを使用して特定のテーブルからタプルを取得する方法を提供します。つまり、単一のテーブルがインデックスを使用してスキャンしてデータを取得するため、複数テーブルのクエリには適していません。
ICPを有効にするかどうかの違い
ICP がない場合、ストレージ エンジンはインデックスを走査してベース テーブル内の行を検索し、行の WHERE 条件を評価するMySQL サーバーにそれらを返します。
ICP が有効になっている場合、WHERE 条件の一部がインデックス内の列のみを使用して計算できる場合、MySQL サーバーは WHERE 条件のこの部分をストレージ エンジンにプッシュします。次に、ストレージ エンジンは、インデックス エントリを使用してプッシュされたインデックスの条件を評価し、その条件が満たされた場合にのみ、テーブルから行が読み取られます。**次の例でその意味を理解できます。
ICPの意味
- 非主キー インデックスでのインデックス プッシュダウンの最適化により、テーブル リターンの数を効果的に減らし、クエリの効率を大幅に向上させることができます。
- ICP は、ストレージ エンジンがベース テーブルにアクセスしなければならない回数を減らすことができます
- MySQL サーバーがストレージ エンジンにアクセスする必要がある回数。
インジケーターの条件付きプッシュダウン最適化の適用可能性は、次の条件によって異なります。
-
ICP は、テーブル行全体へのアクセスが必要な場合に、range、ref、eq_ref、および ref_or_null アクセス メソッドに使用されます。
-
ICP は、分割された InnoDB および MyISAM テーブルを含む InnoDB および MyISAM テーブルで使用できます。
-
InnoDB テーブルの場合、ICP はセカンダリ インデックスにのみ使用されます。ICP の目標は、行全体の読み取り回数を減らし、それによって I/O 操作を減らすことです。InnoDB クラスター化インデックスの場合、完全なレコードは既に InnoDB バッファーに読み込まれています。この場合に ICP を使用しても、I/O は削減されません。(注: Ⅰは、読み取り完了レコード (完全なタプル) の数を減らすことを意味します。Ⅱは、InnoDB クラスター化インデックスでは無効であり、SECOND INDEX などの非クラスター化インデックスに対してのみ有効であることを意味します。)
-
仮想的に生成された列に作成されたセカンダリ インデックスは、ICP をサポートしていません。InnoDB は、仮想生成カラムのセカンダリ インデックスをサポートしています。
-
サブクエリを参照する条件はプッシュダウンできません。
-
ストアド関数を参照する条件はプッシュダウンできません。ストレージ エンジンは、ストアド関数を呼び出すことができません。
-
トリガー条件はプッシュダウンできません。
ICP 最適化の原則
この最適化がどのように機能するかを理解するには、まず、インデックス コンディション プッシュダウンなしでインデックス スキャンがどのように機能するかを考えてみましょう。
- 次の行を取得するには、まずインデックス タプルを読み取り、次にインデックス タプルを使用してテーブル行全体を見つけて読み取ります。
- テストは、この表の条件セクションに適用されます
WHERE
。テスト結果に基づいて行を受け入れるか拒否します。
プッシュダウン プロセス
「インデックス条件」プッシュダウンを使用すると、スキャン プロセスは次のようになります。
- (テーブル行全体ではなく) 次の行のインデックス タプルを取得します。
- このテーブルに適用される条件の部分をテストし、インデックス付きの列を使用してのみチェックできます
WHERE
。条件が満たされない場合は、次の行のインデックス タプルに移動します。 - 条件が満たされた場合、テーブル行全体が検索され、インデックス タプルを使用して読み取られます。
- この表に適用される残りの条件をテストします
WHERE
。テスト結果に基づいて行を受け入れるか拒否します。
EXPLAIN
出力は、インデックス条件を使用してプッシュ ダウンするときに、余分な列でインデックス条件を使用したことを示しています。テーブル行全体を読み取る必要がある場合は適用されないため、インデックスの使用は表示されません。
ケース
テーブルに人々とその住所に関する情報が含まれており、そのテーブルにindex
(Mobile Last, Name, Package) として定義されたインデックスがあるとします。電話番号はわかっているが名前がわからない場合は、次のように検索できます。
SELECT * FROM order
WHERE 手机尾号='9856'
AND 姓名 LIKE '%莫同学%'
AND 包裹号 LIKE '%211%';
MySQL はインデックスを使用して、電話番号が「9856」で終わる人をスキャンできます。2 番目の部分 (LIKE '%Classmate Mo%' という名前) を使用して、スキャンする必要がある行数を制限することはできません。そのため、インデックス プッシュダウンがない場合、このクエリは、電話番号 = を持つすべての人のテーブル行全体を取得する必要があります。 「9850」。
プッシュダウン インデックス条件を使用する場合、MySQL は名前の LIKE '%Mo classmate%' 部分をチェックしてから、テーブル行全体を読み取ります。これにより、携帯電話のサフィックス条件には一致するが名前条件には一致しないインデックス タプルに対応する完全な行を読み取ることが回避されます。
ICP のオンとオフ
デフォルトでは、インデックス基準は「プッシュダウン」で有効になっています。システム変数は flagsを設定することでindex_condition_pushdown
制御できますoptimizer_switch
:
SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';
2021 年 6 月 5 日更新
誰もがこの書き込みは大丈夫だと思っています。いいね、ブックマーク、注目してください。また、私の個人的なブログ
にアクセスすることもできます。これは、近年更新されると推定されています。私と友達になりましょう!https://motongxue.cn