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

时间:2012-10-04 13:53:22

标签: mysql indexing

以下是查询:

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

现在,如果我在字段上添加了包含多个列的索引:

INDEX(accountid,logindate)

MySQL会利用这个多列索引吗?或者它不会使用它,因为一个字段在where子句中而另一个在order语句中?或者,只要我按照多列索引的顺序使用字段,这无关紧要吗?

1 个答案:

答案 0 :(得分:55)

好问题。

索引从左到右工作,因此您的WHERE条件会使用索引。在这种情况下,排序也会使用索引(下面的执行计划)。

来自manual

  

只要索引的所有未使用部分和所有额外ORDER BY列都是{ {1}}条款。以下查询使用索引来解析ORDER BY部分:

WHERE

如果您有一个列索引(ORDER BY),则会使用一个filesort。因此,您的查询确实会从该索引中受益。


两列索引

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

执行计划

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF   ROWS  FILTERED  EXTRA
1   SIMPLE       t1     ref   idx            idx  2        const 5     100       Using where; Using index

单列索引

accountid

执行计划

ID  SELECT_TYPE  TABLE  TYPE   POSSIBLE_KEYS  KEY  KEY_LEN  REF   ROWS  FILTERED  EXTRA
1   SIMPLE       t1     range  idx            idx  2              5     100       Using where; Using filesort