1、覆盖索引不是一种索引,而是基于索引查询的一种方式而已。
2、覆盖索引是一种避免回表查询的优化策略,只要在一颗索引树上就能获取sql语句查询所需要的所有数据,无需回表查询,这样速度更快。
3、覆盖索引的实现方式:将被查询的字段建立普通索引或者联合索引,这样就可以直接返回索引中的数据,不需要通过索引去定位行记录避免回表情况发生。
没用使用覆盖索引:
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name)
)engine=innodb;
查询语句:
explain select id, name, sex from `user` where name = "ls"
explain分析结果:
keys这列的值是name,说明命中索引name,但是sex这一列的值要回表才能查询到。
使用覆盖索引情况
- 表,注意是复合索引
-
create table user ( id int primary key, name varchar(20), sex varchar(5), index(name, sex) )engine=innodb;
sql语句:
explain select id, name, sex from `user` where name = "ls"
explain结果:
-
MySQL官网,类似的说法出现在
explain
查询计划优化章节,即explain
的输出结果Extra字段为Using index
时,能够触发索引覆盖。 -
仅供参考、