了解MySQL查询中的多个列索引

这是查询:

SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1 

现在,如果我在字段中添加了多列的索引:

 INDEX(accountid,logindate) 

MySQL会利用这个多列索引吗? 或者它不会使用它,因为一个字段在where子句中,另一个在order语句中? 或者,只要按照多列索引的顺序使用这些字段,这个问题就不重要了吗?

好问题。

索引工作从左到右,所以你的WHERE标准将使用索引。 在这种情况下,sorting也会使用索引(下面的执行计划)。

从手册 :

即使ORDER BY与索引完全不匹配,只要索引的所有未使用部分和所有额外的ORDER BY列都是WHERE子句中的常量,索引也可以使用。 以下查询使用索引来解决ORDER BY部分:

 SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2; 

如果您有一个列索引( accountid ),则将使用filesort。 因此,您的查询确实受益于该索引。


两列索引

 create table t1 ( accountid tinyint, logindate date); create index idx on t1 (accountid, logindate); insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01') 

执行计划

  ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
 1 SIMPLE t1 ref idx idx 2 const 5 100使用where; 使用索引 

单列索引

 create table t1 ( accountid tinyint, logindate date); create index idx on t1 (accountid); insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01') 

执行计划

  ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
 1 SIMPLE t1范围idx idx 2 5 100使用where; 使用filesort