mySQL中三列的索引

时间:2013-10-20 20:03:01

标签: mysql indexing

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

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

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

2 个答案:

答案 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'