MySQL のインデックス有効条件とインデックス無効条件の結合

MySQL のインデックス有効条件とインデックス無効条件の結合

1. ジョイントインデックスの故障の条件

結合指数は複合指数とも呼ばれます。 2 つ以上の列のインデックスは複合インデックスと呼ばれます。

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

インデックス内の追加の列を使用すると検索の範囲を絞り込むことができますが、2 つの列を持つ 1 つのインデックスを使用することは、2 つの個別のインデックスを使用することとは異なります。複合インデックスの構造は電話帳に似ており、人の名前は姓と名で構成されます。電話帳は、最初に姓のペアで並べ替えられ、次に同じ姓を持つ人の名前のペアで並べ替えられます。電話帳は、姓がわかっていれば非常に便利ですが、名と姓の両方がわかっていればさらに便利ですが、名しかわかっていなければ役に立ちません。

したがって、複合インデックスを作成するときは、列の順序を慎重に考慮する必要があります。複合インデックスは、インデックス内のすべての列または最初の数列のみを検索する場合に便利です。ただし、後続の列のみを検索する場合には役立ちません。

たとえば、名前、年齢、性別の複合インデックスを作成します。

    テーブルmyTestを作成します(
         整数、
         b 整数、
         c 整数、
         キーa(a,b,c)
    );

(1) select * from myTest where a=3 and b=5 and c=4; ---- abc順
3 つのインデックス abc はすべて where 条件で使用され、それぞれが役割を果たします。

(2)c=4かつb=6かつa=3の場合、myTestから*を選択する。
where 内の条件の順序は、クエリを実行する前に MySQL によって自動的に最適化され、効果は前の文と同じです。

(3) a=3かつc=7の場合、myTestから*を選択する。
A はインデックスを使用し、B は使用しないため、C はインデックス効果を使用しません。

(4) select * from myTest where a=3 and b>7 and c=3; ---- b 範囲値、ブレークポイント、c のインデックスをブロック
a が使用され、b も使用されますが、c は使用されません。この場合、b は範囲値であり、これもブレークポイントですが、インデックス自体が使用されます。

(5) select * from myTest where b=3 and c=4; --- 結合インデックスは順番に使用する必要があり、すべてを使用する必要があります。インデックスaは使用されていないため、インデックスbとcはここでは使用されません。

(6) a>4かつb=7かつc=9の場合、myTestから*を選択する。
a は使用されており、b は使用されておらず、c は使用されていません

(7) myTestから*を選択し、a=3でbで順序付けする。
a はインデックスを使用し、b も結果のソートでインデックスの効果を使用します。a より下の b のセグメントはすべてソートされます。

(8) myTestから*を選択し、a=3でcで順序付けする。
aはインデックスを使用しますが、cは途中でブレークポイントがあるため、ソート効果がありません。explainを使用してfilesortを確認してください。

(9) mytableからb=3の順序で*を選択し、aで並べ替えます。
bはインデックスを使用せず、aはソート処理でインデックスの役割を果たさない。

2. インデックス失敗の条件

  • インデックス列に対して操作 (計算、関数、(自動または手動の) 型変換) を実行しないでください。実行すると、インデックスが失敗し、完全なテーブル スキャンに切り替わります。
  • ストレージエンジンは、インデックス範囲条件の右側の列を使用できません。
  • カバーリングインデックス(インデックスのみにアクセスするクエリ(インデックス列とクエリ列が一貫している))を使用し、選択を減らすようにしてください*
  • MySQL では、不等式 (!= または <>) を使用する場合にインデックスを使用できないため、テーブル全体がスキャンされます。
  • はnull、はnullではなく、インデックスも使用できません ---- ここで疑問があります。テスト後、確かに使用できます。refレベルとconstレベルはすべてではありません
  • like がワイルドカード文字 ('%abc...') で始まる場合、MySQL インデックスは失敗し、操作は完全なテーブル スキャンになります。質問: '% string %' のような場合にインデックスが使用されない問題を解決するにはどうすればよいですか?

一重引用符なしでは文字列のインデックス作成が失敗する

SELECT * from staffs where name='2000'; -- MySQL は最下位レベルで暗黙的な型変換を実行するため SELECT * from staffs where name=2000; --- インデックスは使用されません

一般的なアドバイス

  • 単一キー インデックスの場合は、現在のクエリに対してフィルタリング パフォーマンスが優れているインデックスを選択するようにしてください。
  • 複合インデックスを選択すると、現在のクエリ内で最適なフィルタリング プロパティを持つフィールドが、インデックス フィールド順序で可能な限り早い順位にランク付けされます。
  • 複合インデックスを選択するときは、現在のクエリの where 句にさらに多くのフィールドを含めることができるインデックスを選択するようにしてください。
  • 統計を分析し、クエリの記述方法を可能な限り調整して、適切なインデックスを選択するようにしてください。

MySQL ジョイントインデックスの有効性条件とインデックス無効化条件に関するこの記事はこれで終わりです。MySQL ジョイントインデックスの有効性に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベースのインデックスと障害シナリオの詳細な説明
  • MySQL のインデックス障害の一般的なシナリオと回避方法
  • MySQL インデックス失敗の原理
  • MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法
  • MySQL インデックスが失敗する 15 のシナリオを共有する

<<:  Javascript ファイルと Blob の詳細な説明

>>:  RHCE ブリッジング、パスワード不要のログイン、ポート番号の変更の概要

推薦する

Vue で動的なスタイルを実現するためのさまざまな方法のまとめ

目次1. 三項演算子の判定2. 動的に設定されるクラス3. 方法判定4. 配列バインディング5. e...

Linux に nodejs 環境とパス構成をインストールするための詳細な手順

Linux に Node.js をインストールする方法は 2 つあります。1 つは簡単で、解凍して使...

IDEA 構成の Tomcat 起動エラーの問題を解決する

異なるサーブレット パスを構成するときに、次の 2 つのエラーが発生しました。 java.lang....

Linux での中国語入力方法の問題を素早く解決する

背景: 最近、資産報告関連の機能に取り組んでおり、中国語入力をサポートする必要があります。通常のショ...

Dockerコンテナとホストマシン間の8時間の差の問題を解決する

デプロイに docker-compose を使用すると、出力ログと関連イベントが検証されて出力される...

Vueバインディングクラスとバインディングインラインスタイルの実装方法

目次バインディングクラスインラインスタイルのバインディングバインディングクラス方法1:オブジェクト構...

MySQL トランザクション制御フローと ACID 特性

目次1. ACIDの特性トランザクション制御構文3. トランザクション同時実行例外1. ダーティリー...

Vue開発の詳細な説明 ソートコンポーネントコード

目次 <テンプレート> <ul class="コンテナ">...

win10 mysql 5.6.35 winx64 無料インストールバージョン設定チュートリアル

mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...

MySQLで日付を比較する方法の詳細な説明

データ型が datetime であるフィールド add_time を持つテーブル product が...

純粋なJSを使用してセカンダリメニュー効果を実現します

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

jsプロジェクトでの双方向データバインディングの簡単な実装方法

目次序文パブリッシュ・サブスクライバ・パターン結果電話要約する序文双方向データ バインディングとは、...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...

Dockerが正常に起動しない原因と解決策を詳しく解説

1. Docker 起動時の異常なパフォーマンス: 1. ステータスが繰り返し再起動している場合は、...

Web 開発の面接と筆記試験に必須の知識(必読)

HTML のインライン要素とブロックレベル要素の違い:標準的なドキュメント フローでは、ブロック ...