我有 3 列 a、b 和 c,我已将它们索引为 (a,b,c)。我有一个这样的查询:
SELECT * FROM tablename WHERE a=something and c=someone
我的问题是这个查询是否使用这个索引!?
它可以使用a
索引的第一列 ( ),但不能使用第三列 ( c
)。
您可以判断的一种方法是 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
了仅使用其中一个常量值来查找索引中的行。还key_len: 5
显示仅使用了索引的子集,因为具有三个整数的索引条目应大于 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
当我们在所有三列上使用条件时,它表明ref: const,const,const
所有三个值都被用于查找索引条目。并且key_len
足够大,可以输入三个整数。
正如 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'