了解 MySQL 查询中的多列索引

这里有一个问题:

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

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

INDEX(accountid,logindate)

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

64617 次浏览

问得好。

索引从左到右工作,因此 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       Using where; Using index

单列索引

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       Using where; Using filesort