カバリング インデックスは複合インデックスと同じではありません。
col3 に 1 つ、col4 にもう 1 つの 2 つの個別のインデックスがある場合、このクエリではどちらが使用されますか?
カーディナリティが最も高いインデックス。
MySQL は、どのインデックスがどのプロパティを持つかに関する統計を保持します。
(MySQL の統計で明らかなように) 最も識別力のあるインデックスが使用されます。
クエリ内の各テーブルに対して 1 つのインデックスのみが使用されていることをどこかで読みました。それは、クエリが両方のインデックスを使用する方法がないということですか?
副選択を使用できます。
または、col3 と col4 の両方を含む複合インデックスを使用することをお勧めします。
第 2 に、col3 と col4 の両方を一緒に使用して複合インデックスを作成し、WHERE 句で col3 のみを使用すると、パフォーマンスが低下しますか? 例:
複合インデックス
正しい用語はcompound
インデックスであり、複合インデックスではありません。複合インデックスの一番左の部分
のみが使用されます。
したがって、インデックスが次のように定義されている場合
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
参照: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
一番左のフィールドを選択すると、where 句でインデックスのその部分を使用しなくても済むことに注意してください。
複合インデックスがあると想像してください
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
これが機能する理由は、最初のクエリがカバリング インデックスを使用し、それをスキャンするためです。
2 番目のクエリはテーブルにアクセスする必要があるため、インデックスをスキャンしても意味がありません。
これは InnoDB でのみ機能します。
カバリング
インデックスとは カバリング インデックスとは、クエリで選択されたすべてのフィールドがインデックスによる場合を指しますcovered
。その場合、InnoDB (MyISAM ではない) はテーブルのデータを読み取ることはなく、インデックスのデータのみを使用します選択を高速化します。
InnoDB では、プライマリ キーはすべてのセカンダリ インデックスに含まれているため、ある意味ですべてのセカンダリ インデックスは複合インデックスであることに注意してください。
これは、InnoDB で次のクエリを実行すると、次のことを意味します。
SELECT indexed_field FROM table1 WHERE pk = something
MySQL は常にカバリング インデックスを使用し、実際のテーブルにはアクセスしません。 カバリング インデックスを使用することもできますがPRIMARY KEY
、ヒットする必要があるのは 1 行のみであるため、 を優先します。