小编典典

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

mysql

这是查询:

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

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

INDEX(accountid,logindate)

MySQL将利用此多列索引吗?还是不使用它,因为一个字段位于where子句中,而另一个字段位于order语句中?还是只要我按多列索引的顺序使用字段就没关系吗?


阅读 302

收藏
2020-05-17

共1个答案

小编典典

好问题。

索引从左到右起作用,因此您的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表类型POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1 ref idx idx 2 const 5100使用位置; 使用索引

单列索引

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表类型POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1范围idx idx 2 5 100 使用文件排序
2020-05-17