前言
要搞明白覆盖索引首先就得明白主键索引和辅助索引的区别,以及查询时引擎的工作方式。
当然,以上都是基于innoDB引擎来说。
主键索引与辅助索引的区别
相信大家也了解过这方面的知识,这里就不展开了,直接上总结。
主键索引
辅助索引
查询一条数据是如何工作的呢
先说查询过程:
那么如何避免**回表**查询的发生呢?
接下来我们来证明一下它。
回表查询
假如有这样一张表:
CREATE TABLE `test` ( `id` int(11) NOT NULL, `age` int(11) NOT NULL, `name` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `idx_age_name` (`age`,`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
我们给age添加一个索引, 接下来随意插入几条数据
insert into test(`id`,`age`,`name`) VALUES(1,10,"小明"),(2,11,"小红"),(3,12,"小伟");
查询一条数据
select * from test where age = 10
查看一下耗时
分析一下语句:
desc select * from test where age = 10
查看执行计划:
可以看到extra列为空,key则使用了idx_age索引, 大致的查询耗时在0.024秒左右。
这样的查询速度快吗?
覆盖索引
只需要稍微改变一下查询的字段, 我们就发现其中的区别了。
查看一下耗时:
可以看到耗时减少了!
发生了什么呢,我们再来分析一下语句
desc select age,name from test where age = 10
可以看到extra列有一个 *using idnex* , 这个的意思就是使用了覆盖索引,无需回表查询了。