複数列のインデックスを作成しているときに、順序が重要であり、通常、ORDER BY などにある列よりも先に WHERE 句に表示される列が必要であると読んだことがあります。ただし、速度も得られませんか?それぞれに個別にインデックスを付けるとどうなりますか? (明らかに、私自身の実験では、インデックスの動作を組み合わせた方が、それぞれに個別にインデックスを付けるよりもはるかに高速になる可能性があることが示されています)。複数列インデックスを使用する必要があるのはいつですか? また、どのような種類のクエリに効果がありますか?
3 に答える
複数列インデックスは、すべての条件が複数列インデックスの一部である場合に最も効果的です。複数の単一インデックスを使用する場合よりも効果的です。
また、複数列のインデックスがあるが、複数列のインデックスによってインデックス付けされた最初の列を利用しない場合 (または、最初から開始して以前に使用されたインデックスに隣接したままにしない場合)、複数列のインデックスには何のメリットもありません。(たとえば、列 [B、C、D] にインデックスがあり、[C、D] のみを使用する WHERE がある場合、この複数列インデックスには利点がありません。)
参照: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html :
MySQL は、インデックス内のすべての列をテストするクエリ、または最初の列、最初の 2 つの列、最初の 3 つの列などだけをテストするクエリに、複数列のインデックスを使用できます。インデックス定義で列を正しい順序で指定すると、単一の複合インデックスで同じテーブルに対する複数の種類のクエリを高速化できます。
簡単な答えは、「状況によって異なります」です。
長い答えはこれです:あなたが時々するなら
WHERE COL1 = value1 and COL2 = value2
そして時々します
WHERE COL1 = value1
しかし、決して、またはほとんど決してしません
WHERE COL2 = value2
その場合、(COL1、COL2)の複合インデックスが最良の選択になります。(mySQLだけでなく、DBMSの他のメーカーやモデルにも当てはまります。)
インデックスが増えると、INSERTおよびUPDATE操作が遅くなるため、無料ではありません。
複合インデックス (c1,c2) は、次の場合に非常に役立ちます。
- c1=v1 AND c2=v2 の明らかなケース
- WHERE c1=v1 AND c2 BETWEEN v2 と v3 を実行すると、複合インデックスで「範囲スキャン」が実行されます。
- SELECT ... FROM t WHERE c1=v1 ORDER BY c2 - この場合、インデックスを使用して結果をソートできます。
- 場合によっては、「カバリング インデックス」として、たとえば「SELECT c1,c2 FROM t WHERE c1=4」は、テーブルの内容を無視し、インデックスから (範囲) をフェッチするだけです。