前文说到,可以通过联合索引,解决Innodb二级索引的回表问题,

如何解决Innodb二级索引的二次查询问题(回表) — 建立联合索引

联合索引


也称 复合索引,覆盖索引,多列索引,组合索引,

与之对应的是单列索引


只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。

1
2
3
一个包含查询所需字段的索引称为“覆盖索引”

MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率

常见的方法是:将被查询的字段,建立到联合索引里去。


亲测体验


1
2
3
4
5
6
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name)
)engine=innodb;


注: 当select *且where或order by的字段为主键索引id时,自然也无需回表即可查到所有内容


联合索引的创建原则


对于联合索引(abc), 基于最左匹配原则, 匹配条件为 a,ab,abc,acb时,均可以用上该索引,而b,c,bc则使用不到索引

  • 最可能被单独使用的排在最前面.

  • where或order by的顺序不需要按照联合索引的顺序

  • 当有><操作,该字段还可以使用索引,但该列之后将出现断点,无法再用索引

最左匹配原则:

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。



更多可参考