2011-12-11 10 views
0

私は、注文が重要な複数の列のインデックスを作成するときに、通常、WHERE句に最初に表示される列がORDER BYしかし、別々にインデックスを作成するだけでスピードアップすることはできませんか? (明らかに私自身の実験では、結合されたインデックスの振る舞いは、単にそれぞれを別々にインデックス化するよりもずっと速いことがわかります)。どのような場合に複数列のインデックスを使用する必要がありますか?いつMYSQLの1つのインデックスよりも2つより良いインデックス

+0

はい。そしてそれは... –

答えて

3

マルチカラムインデックスは、すべての条件がマルチカラムインデックスの一部である場合に最も効果的です。複数の単一インデックスを持つよりもさらに効果的です。

マルチカラムインデックスを使用していて、マルチカラムインデックスでインデックスされた最初のカラムを使用していない場合(または、最初から開始していない、使用されているインデックス)、マルチカラムインデックスは何のメリットもありません。 (たとえば、列[B、C、D]にインデックスがあり、[C、D]のみを使用するWHEREがある場合は、このマルチカラムインデックスには効果がありません)。

参照:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html :インデックス内のすべての 列をテストするクエリ、または試験ちょうど最初の列、 最初の2列、第3列、などクエリに複数列のインデックスを使用することができ

のMySQL。インデックス定義で正しい順序で列を と指定した場合、単一の 複合インデックスは、同じ テーブルで複数の種類のクエリを高速化できます。

+1

2番目のステートメントは、少なくともSQL Serverでは100%正しいとは言えませんが、MYSQLと同じものと思われます。 –

+0

@MitchWheat - 正確であることが確認されたMySQLのドキュメントからの回答を更新しました。 – ziesemer

+0

私は、colA、colB、colCのインデックスがcolB + colCのカラムでクエリで使用されることがありますが、colAではないという事実を指していました。 –

2

短い答えは、「それは依存します」です。

長い答えはこれです:あなたは時々

WHERE COL1 = value1 and COL2 = value2 

を行い、時には

WHERE COL1 = value1 

決して、あるいはほとんどない操作を行い、その後、複合インデックスを

WHERE COL2 = value2 

をすれば(COL1、COL2)が最適です。 (MySQLの場合はもちろん、DBMSの他のメーカーやモデルと同様に)

インデックスの数が増えると、INSERTとUPDATEの操作が遅くなるため、空き領域にはなりません。

1

複合インデックス(C1、C2)次の場合に非常に有用である:

  1. C1 = V1とC2 = v2の
  2. 明白な場合、あなたはWHERE C1 = V1とC2との間をすればv2とv3 - 複合インデックスの "レンジスキャン"を行います。
  3. SELECT ... FROM t WHERE c1 = v1 ORDER BY c2 - この場合、インデックスを使用して結果を並べ替えることができます。いくつかの場合、「カバー指数」として、例えば、 "SELECT c1、c2 FROM t WHERE c1 = 4"はテーブルの内容を無視し、インデックスから(範囲)をフェッチするだけです。
関連する問題