前言
先说一下什么是覆盖索引
- 覆盖索引是一种数据查询方式,不是索引类型
- 在索引数据结构中,通过索引值可以直接找到要查询字段的值,而不需要通过主键值回表查询,那么就叫覆盖索引
- 查询的字段被使用到的索引树全部覆盖到
应用场景
我们先建一个表
CREATE TABLE `order` (
`id` int NOT NULL AUTO_INCREMENT,
`orderNum` varchar(255) DEFAULT NULL,
`phone` varchar(11) DEFAULT NULL,
`pid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `IDX_ORDERNUM_PHONE` (`orderNum`,`phone`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们创建了一个存储引擎为InnoDB的表order,并设置id为主键,另外为orderNum和phone创建了联合索引,最后向表中随机初始化了100W+条数据。
InnoDB会自动为主键id创建一棵名为主键索引(又叫做聚簇索引)的B+树,这个B+树的最重要的特点就是叶子节点包含了完整的用户记录。
如果我们执行一个sql查询
SELECT * FROM order WHERE orderNum = '123456';
InnoDB存储引擎会根据搜索条件在该二级索引的叶子节点中找到
orderNum为123456的记录,但是二级索引中只记录了orderNum、phone和主键id字段,因此InnoDB需要拿着主键id去主键索引中查找这一条完整的记录,这个过程叫做回表。
我们再执行一个sql查询
SELECT phone FROM order WHERE orderNum = '123456';
可以看到Extra一列显示
Using where;Using index,表示我们的查询内容在索引内,where条件为索引最左列,能够直接摒弃回表操作,大幅度提高查询效率。