以下是查询:
SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1
现在,如果我在字段上添加了包含多个列的索引:
INDEX(accountid,logindate)
MySQL会利用这个多列索引吗?或者它不会使用它,因为一个字段在where子句中而另一个在order语句中?或者,只要我按照多列索引的顺序使用字段,这无关紧要吗?
答案 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