这是查询:
SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1
现在,如果我在字段上添加了一个包含多列的索引:
INDEX(accountid,logindate)
MySQL 会利用这个多列索引吗?或者它不会因为一个字段在 where 子句中而另一个字段在 order 语句中而不使用它?或者只要我按照多列索引的顺序使用字段就没有关系?
好问题。
索引从左到右工作,因此您的WHERE
标准将使用索引。在这种情况下,排序也将使用索引(下面的执行计划)。
从手册:
即使
ORDER BY
索引不完全匹配索引,也可以使用索引,只要索引的所有未使用部分和所有额外ORDER BY
列都是WHERE
子句中的常量。以下查询使用索引来解析ORDER BY
部件:SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;
如果您有一个单列索引 ( accountid
),则将使用文件排序。因此,您的查询确实受益于该索引。
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 range idx idx 2 5 100 使用 where;使用文件排序