MySQL パフォーマンス最適化インデックス プッシュダウン

MySQL パフォーマンス最適化インデックス プッシュダウン

インデックス条件プッシュダウン (ICP) は MySQL 5.6 で導入され、クエリを最適化するために使用されます。

ICP を使用せずに、非主キー インデックス (通常のインデックスまたはセカンダリ インデックスとも呼ばれます) を使用してクエリを実行すると、ストレージ エンジンはインデックスを通じてデータを取得し、それを MySQL サーバーに返します。その後、MySQL サーバーはデータが条件を満たしているかどうかを判断します。

ICP を使用する場合、特定のインデックス列に判定条件がある場合、MySQL サーバーはこれらの判定条件をストレージ エンジンに渡し、ストレージ エンジンはインデックスが MySQL サーバーから渡された条件を満たしているかどうかを判断します。インデックスが条件を満たしている場合にのみ、データが取得され、MySQL サーバーに返されます。

インデックス条件プッシュダウンの最適化により、ストレージ エンジンがベース テーブルをクエリする回数と、MySQL サーバーがストレージ エンジンからデータを受信する回数を削減できます。

自慰行為を始める

始める前に、ユーザー テーブル (user) を準備する必要があります。このテーブルの主なフィールドは、id、名前、年齢、住所です。共同インデックス(名前、年齢)を作成します。

ファーストネームが Chen であるすべてのユーザーを一致させる必要があると仮定します。SQL ステートメントは次のようになります。

SELECT * from user where name like '陈%'

「最良左プレフィックス」の原則に従って、ここでは結合インデックス (名前、年齢) がクエリに使用され、パフォーマンスは完全なテーブルスキャンよりも確実に高くなります。

問題は、他の条件がある場合はどうなるかということです。ファーストネームが Chen で、年齢が 20 歳のユーザーを一致させるという別の要件があるとします。このときの SQL ステートメントは次のようになります。

名前が '陈%' で、年齢が 20 であるユーザーから SELECT * を実行します。

この SQL ステートメントはどのように実行すればよいでしょうか?以下は、MySQL 5.6 以前とそれ以降のバージョンの分析です。

MySQL バージョン 5.6 より前

5.6 より前のバージョンにはインデックス プッシュダウンの最適化がないため、実行プロセスは次のようになります。

age フィールドは無視され、クエリは name を通じて直接実行されます。(name, age) レッスン ツリーには、それぞれ ID が 2 と 1 である 2 つの結果が見つかります。次に、取得された ID 値を使用して、テーブルを何度もクエリします。したがって、このプロセスではテーブルに 2 回戻る必要があります。

Mysql5.6以降のバージョン

バージョン 5.6 ではインデックス プッシュダウンの最適化が追加され、実行プロセスは次のようになります。

InnoDB は age フィールドを無視しません。代わりに、インデックス内で age が 20 に等しいかどうかを判断し、20 に等しくないレコードを直接スキップします。したがって、(name, age) インデックス ツリーでは 1 つのレコードのみが一致します。この時点で、id を使用して主キー インデックス ツリー内のすべてのデータをクエリします。このプロセスでは、 1 つのテーブルを返すだけで済みます。

練習する

もちろん、上記の分析はあくまでも原理的なものです。実際に分析することができます。そこで、Chen は MySQL バージョン 5.6 をインストールし、上記のステートメントを次のように解析しました。

explain 分析結果によると、Extra の値が Using index condition になっていることがわかります。これは、インデックス プッシュダウンが使用されたことを意味します。

要約する

非主キー インデックスでのインデックス プッシュダウンの最適化により、テーブル戻りの数を効果的に削減し、クエリ効率を大幅に向上させることができます。

インデックス プッシュダウンをオフにするには、次のコマンドを使用します。設定ファイルの変更についてはこれ以上説明しません。結局のところ、なぜこのような優れた機能をオフにするのでしょうか?

optimizer_switch='index_condition_pushdown=off' を設定します。

これで、MySQL パフォーマンスの最適化とインデックス プッシュダウンに関するこの記事は終了です。MySQL インデックス プッシュダウンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL インデックスのパフォーマンス最適化の問題に対する解決策
  • MySQL パフォーマンスの最適化: インデックスを効率的かつ正しく使用する方法
  • MySQL パフォーマンス最適化の事例 - インデックス共有のカバー
  • MySQL パフォーマンス最適化のケーススタディ - インデックスと SQL_NO_CACHE をカバー
  • MySQL パフォーマンス最適化インデックス最適化
  • MySQL インデックスの使用戦略と最適化 (高パフォーマンス インデックス戦略)
  • MySQLはパフォーマンスを最適化するためにインデックスを使用します

<<:  純粋な CSS3 で美しい入力ボックスアニメーションスタイルライブラリを実現 (テキスト入力愛)

>>:  突然外部ネットワークからDockerにアクセスできなくなる問題の解決方法

推薦する

Linuxダイナミックリンクライブラリの使用

通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装...

CSS3は、大きな円のドット分布と回転効果を実現するためにtransform-originを使用します。

まず、transform-origin 属性を使用する必要があります。transform 属性は必ず...

MySQLは重複しないデータ挿入を実装するためにUNIQUEを使用する

SQL UNIQUE制約UNIQUE 制約は、データベース テーブル内の各レコードを一意に識別します...

1つの記事でNavicat for MySQLの基本を理解する

目次1. データベース操作2. データ型3. バックアップとリカバリ3. 操作4. 上級5. 知識補...

Vueバスの簡単な使い方

Vueバスの簡単な使い方シナリオの説明:コンポーネント A にはコンポーネント B と C が含まれ...

CSS を使用して画像の色を変更する 100 の方法 (収集する価値あり)

序文「画像処理というと、PhotoShop などの画像処理ツールを思い浮かべることが多いです。フロン...

CSS はスクロールバーを非表示にしてコンテンツをスクロールする効果を実現します (3 つの方法)

フロントエンド開発では、スクロールバーを非表示にしながらスクロールをサポートしなければならないという...

MySQLの日付と時刻関数の使用の概要

この記事はMySQL 8.0に基づいていますこの記事では、日付と時刻の操作のための MySQL 関数...

WeChatアプレットのオーディオコンポーネントがiOSで再生できない問題の解決策

解決策:クリック イベントをオーディオ コンポーネントにバインドし、再生メソッドと一時停止メソッドを...

ウェブページの右下隅に「いいね!」カード効果を実現するための CSS (サンプルコード)

効果 HTML を実装するには、まずクリーンな HTML ページを準備し、ノードを記述します。 &l...

React.cloneElement の使い方の詳しい説明

目次cloneElementの役割使用シナリオ新しい小道具を追加するプロップを変更するイベントカスタ...

MySQLクエリ文の実行プロセスを理解するための記事

序文要件を満たす特定のデータをデータベースから取得する必要があります。Select ABC FROM...

MySQL クエリ フィールド タイプが json の場合の 2 つのクエリ メソッド

テーブル構造は次のとおりです。 id varchar(32) 情報JSONデータ: id = 1 i...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...