MySQLでパフォーマンス関連の質問があります。複数の単一列インデックスは、1つの複数列インデックスよりも高速ですか?
最後の手段としてのみ
複数のインデックスを持つことは、MySQLクエリオプティマイザーにとってかなり困難な冒険になる可能性があります。
私は以前にこれについて書いた
Sep 18, 2012
: MySQLによるクエリで複数のインデックスがどのように使用されますか?Apr 19, 2014
: インデックスの最適化 (見出しの下[ANSWER TO QUESTION #2
)本質的に、MySQLは複数のインデックスに沿って検索を行い、 結果のインデックスマージ を実行します。これは、クエリのWHERE
、GROUP BY
、およびORDER BY
句で使用できる複合インデックスがない場合にのみ、最後の手段として行われます。
複数列インデックスの列の順序にも関係があります。次のものがある場合:
(a),(b),(c)
(a,b,c)
の同じテーブルWHERE
、GROUP BY
、およびORDER BY
句がインデックス(a,b,c)
内の順序でインデックス付きの列を利用する場合、3列のインデックスの方が優れています。異なる組み合わせを使用すると、(a,b,c)
のインデックス範囲スキャンが発生する可能性があります。次に最適なのは、(a,b,c)
のフルインデックススキャンです。これらが不可能な場合、最後の手段は、(a)
、(b)
、(c)
を個別に検索することのマージになります。
Aとbをテストする場合は、INDEX(a、b)の方が優れている可能性があります。
フラグのインデックス付け(それ自体)はほとんど役に立ちません。
SHOW CREATE TABLE
といくつかのWHERE
句を提供してください。具体的なアドバイスをいたします。
以下は、しばしば最適化されるINDEXを作成するための簡単なクックブックです。 WHERE
で結ばれた一連の式を持つAND
が与えられた場合:
定数と比較され、関数で非表示にされていないすべての列(ある場合)を任意の順序でリストします。
インデックスに追加する機会がもう1つあります。該当する最初のものを実行します。
2a。 「範囲」で使用される列-例:BETWEEN
、LIKE
先行ワイルドカードなし、「>」など。
2b。 GROUP BY
のすべての列。
2c。 ASCとDESCの混合がない場合のORDER BY
のすべての列。
この簡略化されたクックブックが失敗する例外はありますが、ケースの大部分をカバーしていると思います。 2つの注目すべき例外は、「インデックスのカバー」とOR
句です。また、冗長なインデックスを追加しないことをお勧めしません。
質問によって異なりますので、質問に対する明確な回答はありません。しかし:あなたがフィルタリングしたい場合、例えば2つの列の場合、結合インデックスの方が効果的です。
クエリプランが構築されると、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にインデックスがある場合、クエリで年齢より前に名前がチェックされるため、インデックスは使用されません。