a、b、c の 3 つの列があり、(a、b、c) としてインデックスを付けました。私はこのようなクエリを持っています:
SELECT * FROM tablename WHERE a=something and c=someone
私の質問は、このクエリはこのインデックスを使用するかどうかです!?
インデックスの 1 列目 ( a
) は使用できますが、3 列目 ( ) は使用できませんc
。
1 つの方法は、EXPLAIN の出力です。
次に例を示します。
mysql> create table tablename (a int, b int, c int, key (a,b,c));
...I filled it with some random data...
mysql> explain SELECT * FROM tablename WHERE a=125 and c=456\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tablename
type: ref
possible_keys: a
key: a
key_len: 5
ref: const
rows: 20
Extra: Using where; Using index
上記はref: const
、インデックス内の行を検索するために定数値の 1 つだけが使用されていることを示しています。また、key_len: 5
3 つの整数を含むインデックス エントリは 5 バイトより大きくなければならないため、インデックスのサブセットのみが使用されていることを示しています。
mysql> explain SELECT * FROM tablename WHERE a=125 and b = 789 and c=456\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tablename
type: ref
possible_keys: a
key: a
key_len: 15
ref: const,const,const
rows: 1
Extra: Using index
3 つの列すべてで条件を使用すると、ref: const,const,const
3 つの値すべてがインデックス エントリの検索に使用されていることがわかります。はkey_len
3 つの整数のエントリに十分な大きさです。
Mihal が言うように、クエリの前に EXPLAIN を付けると、オプティマイザーはインデックスを使用するかどうかを通知します。Bill は、インデックス内の a の値のみを検索するという点で部分的に正しいですが、テーブルに列 a、b、および cのみが含まれている場合、インデックスはカバーされ、b および c の値はから取得されます。テーブル データを参照せずにインデックスを作成しますが、DBMS はインデックス内の b と c のすべての値をスキャンします。c に指定された値に直接アクセスするだけではありません。
b が整数であると仮定すると、より深いインデックスを使用するようにクエリをごまかすことができる場合があります。
SELECT *
FROM tablename
WHERE a='something'
AND b BETWEEN -8388608 AND 8388607
AND c='someone'