我有3列a,b和c,我将它们编入索引为(a,b,c)。我有这样的查询:
SELECT * FROM tablename WHERE a=something and c=someone
我的问题是此查询是否使用此索引!?
答案 0 :(得分:4)
它可能使用索引的第一列(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
足够大,可以成为三个整数的条目。
答案 1 :(得分:0)
正如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'