MySQL ジョイントインデックスの使用ルール

MySQL ジョイントインデックスの使用ルール

結合指数は複合指数とも呼ばれます。複合インデックスの場合: MySQL はインデックス内のフィールドを左から右に使用します。クエリではインデックスの一部のみ、つまり左端の部分のみを使用できます。たとえば、インデックスはキーインデックス (a,b,c) です。a | a,b | a,b,c の 3 つの組み合わせの検索はサポートできますが、b,c の検索はサポートしていません。左端のフィールドが定数参照の場合、インデックスは非常に効果的です。

興味深い質問から始めましょう:

テーブルに結合インデックス (c1、c2、c3、c4) があるとします。どのフィールドがインデックスを使用しますか?
c1=x かつ c2=x かつ c4>x かつ c3=x の場合
B、c1=x、c2=x、c4=x、c3の順序
C、c1=x、c4=x の場合、c3、c2 でグループ化
D ここで c1=? かつ c5=? で c2,c3 の順
E ここで c1=? かつ c2=? かつ c5=? で c2,c3 の順序

始めましょう:

まずテーブルを作成します。

テーブルtを作成します(
c1 CHAR(1) NULLではない、
c2 CHAR(1) NULLではない、
c3 CHAR(1) NULLではない、
c4 CHAR(1) NULLではない、
c5 CHAR(1) ヌルではない
)エンジン myisam CHARSET UTF8;


c1からc5までの5つのフィールドがあります。フィールドタイプはすべて固定長char(1)型であり、空ではないことに注意してください。文字セットはutf8です(インデックスの計算に使用されるバイト数に関連します)

インデックスを作成します。

テーブル t を変更し、インデックス c1234(c1,c2,c3,c4) を追加します。

2 つのレコードを挿入します: insert into t VALUES('1','1','1','1','1'),('2','2','2','2','2','2')

MySql Explain を使用して、質問の結果の分析を開始します。

オプションA:


結果からわかるように、c1、c2、c3、c4 はすべてインデックスを使用しており、A の結果を少し変更しています。

c2 条件を削除した後:


左端のインデックス原則によれば、c2 フィールドはインデックスを使用せず、c2 より後のフィールドはインデックスを使用できません。次の 2 つの図では、左端のインデックス原理を比較しています。


上図の結果は、c3 を直接使用すると完全なテーブルクエリになり、インデックスを使用できないことを示しています。したがって、c3 フィールドにインデックスを使用する前提は、c1 フィールドと c2 フィールドの両方でインデックスが使用されていることです。

それがインデックスの一番左の原則(左接頭辞原則)です。

オプションB:


key_len の長さは、インデックスが c1 および c2 フィールドで使用されていることを示しています。Extra は、ソートに一時テーブルが使用されていないことを示しています。つまり、インデックスはソートに使用されていますが、key_len 値では計算されておらず、c4 に接続する目的には役立ちません。つまり、インデックスは c3 で壊れていることを意味します。

実際、ソートはジョイント インデックスを使用して直接実行されます。つまり、c1234 ジョイント インデックスを使用すると、c1 の下の c2、c2 の下の c3、c3 の下の c4 がすでに整列しています。したがって、ソートでは実際にはインデックスが使用されますが、c3 フィールドではインデックスは使用されません。 (この段落を書くときはいつも少しぎこちなく感じました。正しく理解しているかどうかわかりません。まださらに調査が必要です)

オプションC:


グループ化を使用する場合、通常は最初に一時ファイルが生成され、その後ソートされます。ただし、フィールド順序が c2、c3 の場合、一時テーブルはソートに使用されず、インデックスがソートに使用されます。グループ化フィールドが c3、c2 の場合、順序がインデックス フィールドの順序と一致しないため、インデックスはグループ化とソートに使用されません。

key_len の長さによって決定され、c1 フィールドのみがインデックスを使用します。

オプションD:


order by は group by に似ています。フィールドの順序がインデックスと一致している場合は、インデックスが並べ替えに使用されます。フィールドの順序がインデックスと一致していない場合は、インデックスは使用されません。

key_len の長さによって決定され、c1 フィールドのみがインデックスを使用します。

オプションE:


実際、オプション E の結果分析は、上記の ABCD の結果で分析されています。ここでは、c1 フィールドと c2 フィールドのみがこのインデックスを使用します。

上記の質問に対する答えをまとめると次のようになります。

A: 4 つのフィールドすべてがこのインデックスを使用します。

B: c1、c2フィールドはこのインデックスを使用します

C:c1フィールドはこのインデックスを使用します

D:c1フィールドはこのインデックスを使用します

E: c1 フィールドと c2 フィールドはこのインデックスを使用します。

要約:

インデックスの左端原則(左プレフィックス原則)は、(c1, c2, c3, c4....cN)の結合インデックスのように、インデックスが設定されているフィールドの順序で where 条件を使用します(and 条件を順番に記述しなければならないという意味ではありません)。途中の列に条件がない場合や like を使用した場合は、それ以降の列ではインデックスを使用できません。

インデックスはグループ化や並べ替えにも使用できます。グループ化では、まず並べ替え、次に平均の計算などが必要になります。したがって、グループ化と並べ替えでは、フィールドの順序がインデックス付きフィールドの順序に従うことができれば、インデックスの順序付けされた性質を利用できます。

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

以下もご興味があるかもしれません:
  • MySQL 独立インデックスと共同インデックスの選択
  • MySQL ジョイントインデックス(複合インデックス)の実装
  • MySQLジョイントインデックスの左端一致原則の詳細な分析
  • MySQLのジョイントインデックス機能の分析と使用例
  • MySQL ジョイントインデックスの使用例
  • MySQL のジョイントインデックス学習チュートリアル
  • MySQL のインデックス有効条件とインデックス無効条件の結合

<<:  CSS ハック \9 と \0 は IE11\IE9\IE8 のハッキングには機能しない可能性があります

>>:  iframe パラメータの説明と例

推薦する

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

JavaScript を使用してセカンダリ メニューを作成する

この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...

HTMLページの文字セットを指定する2つの方法

1. HTMLページの文字セットを指定する2つの方法方法1: <メタ文字セット="u...

アクセス速度を上げるためにウェブサイトを最適化する方法の更新

最近、同社はitpubを皮切りに、コーポレートウェブサイト傘下の全サイトの評価を開始した。そのために...

nginx を https をサポートするように設定するためのサンプル コード

1. はじめにあなたのウェブサイトはまだインターネット上に公開されたままですか?ここでは、HTTPS...

Dockerコンテナを介してランプアーキテクチャを構築するプロセス

目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...

MySQLのグローバルロックとテーブルロックに関する詳細な理解

序文ロックの範囲に応じて、MySQL のロックは、グローバル ロック、テーブル ロック、行ロックに大...

Tomcatサーバーのセキュリティ設定方法

Tomcat は、Java Community Process を通じて Sun が開発した、広く使...

Reactでカスタムフックを作成する方法を教えます

1. カスタムフックとは何かロジックの再利用簡単に言えば、カスタム フックを使用すると、特定のコンポ...

Tomcat および Web アプリケーションの Docker デプロイメントの実装

1.dockerをオンラインでダウンロードする yum インストール -y epel-release...

MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法を参考ま...

大量のデータを含むエレメントのシャトルボックスで「すべて選択」をクリックするとスタックする問題の解決方法

目次解決策1: EUIの転送コンポーネントをコピーして変更し、プロジェクトディレクトリに導入する解決...

権限の問題によりMySQLの設定ファイルmy.cnfを起動できない問題の解決方法

この記事では、権限の問題により MySQL 構成ファイル my.cnf を起動できない場合の関連する...

HTML ではスペースはどのように表現されますか (どのような意味ですか)?

Web 開発では、次のような文字によく遭遇します: &nbsp;これは実際には HTML が...

Tomcat が IDEA のコンソールで文字化けを起こし、IDEA エンコーディングを UTF-8 に設定する方法

1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...