web-dev-qa-db-ja.com

MySQLでは、複数の単一列インデックスは1つの複数列インデックスよりも高速ですか?

MySQLでパフォーマンス関連の質問があります。複数の単一列インデックスは、1つの複数列インデックスよりも高速ですか?

3
user3280601

短い答え

最後の手段としてのみ

長い答え

複数のインデックスを持つことは、MySQLクエリオプティマイザーにとってかなり困難な冒険になる可能性があります。

私は以前にこれについて書いた

本質的に、MySQLは複数のインデックスに沿って検索を行い、 結果のインデックスマージ を実行します。これは、クエリのWHEREGROUP BY、およびORDER BY句で使用できる複合インデックスがない場合にのみ、最後の手段として行われます。

複数列インデックスの列の順序にも関係があります。次のものがある場合:

  • インデックス付きのテーブル(a),(b),(c)
  • インデックス(a,b,c)の同じテーブル

WHEREGROUP BY、およびORDER BY句がインデックス(a,b,c)内の順序でインデックス付きの列を利用する場合、3列のインデックスの方が優れています。異なる組み合わせを使用すると、(a,b,c)のインデックス範囲スキャンが発生する可能性があります。次に最適なのは、(a,b,c)のフルインデックススキャンです。これらが不可能な場合、最後の手段は、(a)(b)(c)を個別に検索することのマージになります。

5
RolandoMySQLDBA

Aとbをテストする場合は、INDEX(a、b)の方が優れている可能性があります。

フラグのインデックス付け(それ自体)はほとんど役に立ちません。

SHOW CREATE TABLEといくつかのWHERE句を提供してください。具体的なアドバイスをいたします。

以下は、しばしば最適化されるINDEXを作成するための簡単なクックブックです。 WHEREで結ばれた一連の式を持つANDが与えられた場合:

  1. 定数と比較され、関数で非表示にされていないすべての列(ある場合)を任意の順序でリストします。

  2. インデックスに追加する機会がもう1つあります。該当する最初のものを実行します。

2a。 「範囲」で使用される列-例:BETWEENLIKE先行ワイルドカードなし、「>」など。

2b。 GROUP BYのすべての列。

2c。 ASCとDESCの混合がない場合のORDER BYのすべての列。

この簡略化されたクックブックが失敗する例外はありますが、ケースの大部分をカバーしていると思います。 2つの注目すべき例外は、「インデックスのカバー」とOR句です。また、冗長なインデックスを追加しないことをお勧めしません。

2
Rick James

質問によって異なりますので、質問に対する明確な回答はありません。しかし:あなたがフィルタリングしたい場合、例えば2つの列の場合、結合インデックスの方が効果的です。

0
frlan

クエリプランが構築されると、MySQLは最終的にテーブルのインデックスの1つのみを使用することを決定します。つまり、単一のクエリで複数の単一列のインデックスが使用されることはありません。ただし、必要なすべてのフィールド(カバレッジインデックス)をカバーする複数列の単一インデックスがある場合、データベースはディスクから読み取る必要がないため、クエリが非常に高速になります。

table:   ID|Name|age|sex
query:  select sex from table where name= 'x' and age ='y';   

このクエリでは、名前、年齢、性別に3つの個別のインデックスがある場合、最も有効なもの(オプティマイザーによって計算されます)のみが使用されますが、name-age-sexに単一のインデックスがある場合は、はるかに高速になります。

インデックスはクエリで左から右に評価されることにも注意してください。つまり、age-name-sexにインデックスがある場合、クエリで年齢より前に名前がチェックされるため、インデックスは使用されません。

0
Akshat