MySQLインデックスマージの使い方

MySQLインデックスマージの使い方

インデックスのマージは、MySQL が最下層で提供するインテリジェントなアルゴリズムです。インデックスマージアルゴリズムを理解すると、より優れたインデックスを作成するのに役立ちます。

インデックス マージは、複数の範囲スキャンを実行し、その結果セットをマージすることで行を取得します。複数のテーブルにわたるインデックス スキャンではなく、単一のテーブルからのインデックス スキャンのみがマージされます。マージにより、結合、交差、交差の結合 (最初に交差してからマージ) という 3 つの形式の基礎スキャンが生成されます。

次の 4 つの例では、インデックスのマージが行われます。

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;
SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col;
SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

インデックス マージには次の既知の制限があります。

1. クエリ ステートメントに、AND/OR ネストが厳しい複雑な WHERE 句が含まれており、MySQL が最適なプランを選択しない場合は、次の識別子変換を使用してみてください。

(x かつ y) または z => (x または z) かつ (y または z)
(x または y) かつ z => (x かつ z) または (y かつ z)

2. インデックスのマージはフルテキスト インデックスには適用されません。

EXPLAIN ステートメントの出力では、インデックス マージはタイプ列に「index_merge」として表示されます。この場合、キー列には使用されるインデックスのリストが含まれます。
インデックス マージ アクセス メソッドにはいくつかのアルゴリズムがあり、EXPLAIN ステートメント出力の Extra フィールドに表示されます。

intersect(...) を使用する
union(...) を使用する
sort_union(...) を使用する

これらのアルゴリズムについては以下で詳しく説明します。オプティマイザーは、利用可能なさまざまなオプションのコスト見積もりに基づいて、さまざまなインデックス マージ アルゴリズムとその他のアクセス方法を選択します。

インデックスマージ交差アルゴリズム

インデックス マージ交差アルゴリズムは、使用されているすべてのインデックスの同時スキャンを実行し、マージされたインデックス スキャンから受信した行のシーケンスの交差を生成します。
このアルゴリズムは、WHERE 句が AND で接続された異なるインデックス キーの複数の範囲条件に変換され、条件が次のいずれかである場合に機能します。

1. この形式の N 部分式では、インデックスには正確に N 個のフィールド (すべてのインデックス フィールドがカバーされます) が含まれます。N >= 1、N が 1 より大きい場合は複合インデックスになります。

key_part1 = const1 かつ key_part2 = const2 ... かつ key_partN = constN です。

2. InnoDB テーブルの主キーに対する任意の範囲条件。

例:

innodb_tableから*を選択
primary_key < 10 かつ key_col1 = 20 の場合;
SELECT * FROM tbl_name
ここで、key1_part1 = 1 かつ key1_part2 = 2 かつ key2 = 2;

インデックスマージユニオンアルゴリズム

このアルゴリズムは、インデックス マージ交差アルゴリズムに似ており、WHERE 句が OR で接続された異なるインデックス キーの複数の範囲条件に変換され、条件が次の 3 つのいずれかである場合に適用できます。

1. この形式の N 部分式では、インデックスには正確に N 個のフィールド (すべてのインデックス フィールドがカバーされます) が含まれます。N >= 1、N が 1 より大きい場合は複合インデックスになります。

key_part1 = const1 かつ key_part2 = const2 ... かつ key_partN = constN です。

2. InnoDB テーブルの主キーに対する任意の範囲条件。
3. インデックスマージ交差アルゴリズムの条件を満たします。

例:

t1から*を選択
ここで、key1 = 1 または key2 = 2 または key3 = 3;
innodb_tableから*を選択
(key1 = 1 かつ key2 = 2)
または (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;

インデックスマージソート-結合アルゴリズム

このアルゴリズムは、WHERE 句が OR で接続された異なるインデックス キーの複数の範囲条件に変換される場合に機能しますが、インデックス マージ ユニオン アルゴリズムには準拠していません。 Index Merge Sort-Union アルゴリズムと Index Merge Union アルゴリズムの違いは、Index Merge Sort-Union では、行を返す前に、まずすべての行の行 ID を取得し、それらを並べ替える必要があることです。

例:

SELECT * FROM tbl_name
key_col1 < 10 または key_col2 < 20;
SELECT * FROM tbl_name
ここで (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

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

以下もご興味があるかもしれません:
  • mysql インデックスの追加 mysql インデックスの作成方法
  • MySQL インデックスタイプの概要と使用上のヒントと注意事項
  • MySQL でインデックスを表示、作成、削除する方法
  • MySQL パフォーマンス最適化インデックス最適化
  • Mysql インデックスが失敗するいくつかの状況の分析
  • MySQL全文インデックスに基づく詳細な理解
  • MYSQL における一般的な必須操作 (必須インデックスなど)
  • MySQL インデックス分析と最適化

<<:  コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。

>>:  シンプルなjQuery + CSSを使用してカスタムタグタイトルツールチップを作成します

推薦する

Vue.jsはカレンダー機能を実装します

この記事では、カレンダー機能を実装するためのVue.jsの具体的なコードを例として紹介します。具体的...

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

MySQL のインストールに関する以前のメモを要約して、皆さんと共有しました。ステップ 1: mys...

MySQLにデータを素早くインポートする方法

序文:日々の勉強や仕事の中で、データをエクスポートする必要に迫られることがよくあります。たとえば、デ...

Linux で複数の mysql5.7.19 (tar.gz) ファイルをインストールする方法

LinuxでのMySQL-5.7.19バージョンの初心者向けの最初のインストールについては、前の記事...

高性能ウェブサイトの最適化ガイド

パフォーマンスの黄金律:エンドユーザーの応答時間のわずか 10% ~ 20% が HTML ドキュメ...

DockerコンテナにRedisをデプロイする手順の紹介

目次1 つの Redis 設定ファイル2 Dockerコマンドの開始3 docker-compose...

Nginx をインストールして複数のドメイン名を設定する方法

Nginx のインストールCentOS 6.x yum にはデフォルトで nginx ソフトウェア ...

JSはフロントエンドのページング効果を実現します

この記事の例では、フロントエンドのページング効果を実現するためのJSの具体的なコードを参考までに共有...

mysql update文の実行プロセスの詳細な説明

以前、MySQL クエリ文の実行プロセスについての記事がありました。ここでは、更新文の実行プロセスを...

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

MySQL 5.7.27の詳細なダウンロード、インストール、および構成チュートリアルは参考までに、具...

MySQLのスイッチングデータ保存ディレクトリの実装方法

MySQLのスイッチングデータ保存ディレクトリの実装方法今日、仕事中に、mysql が保存されている...

HTML サブタグと sup タグ

今日はあまり使わないHTMLタグ「subタグ」と「supタグ」を紹介します。定義と使用法: <...

Vue プロジェクトで mock を使用する方法をご存知ですか?

目次最初のステップ: 2 番目のステップは、request.js で関連する構成を行うことです。re...

Linux での MySQL 5.7.16 無料インストール バージョンのグラフィック チュートリアル

この記事では、参考までにMySQL 5.7.16の無料インストール版のチュートリアルを紹介します。具...

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

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...