2

我有 3 列 a、b 和 c,我已将它们索引为 (a,b,c)。我有一个这样的查询:

SELECT * FROM tablename WHERE a=something and c=someone

我的问题是这个查询是否使用这个索引!?

4

2 回答 2

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足够大,可以输入三个整数。

于 2013-10-20T20:04:31.617 回答
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'
于 2013-10-20T20:16:28.163 回答