什么是覆盖索引?

前言

要搞明白覆盖索引首先就得明白主键索引辅助索引的区别,以及查询时引擎的工作方式。

当然,以上都是基于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秒左右。

这样的查询速度快吗?

我说我还能再优化一下,你敢信吗? - 鲁迅(我没说过)

覆盖索引

只需要稍微改变一下查询的字段, 我们就发现其中的区别了。

select age,name from test where age = 10

查看一下耗时:

可以看到耗时减少了!

发生了什么呢,我们再来分析一下语句

desc select age,name from test where age = 10

可以看到extra列有一个 using index , 这个的意思就是使用了覆盖索引,无需回表查询了。

总结

实践是检验原理的唯一标准。 通过此次实践,想必你已经充分了解并且体验到覆盖索引的概念及其意义了。其核心就是只从辅助索引要数据。那么, 普通索引(单字段)和联合索引,以及唯一索引都能实现覆盖索引的作用。

你的赞是我创作的动力! 三连(暗示)。

我是三海, 致力于用最简洁的文字讲述后台开发技术的猿人。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

666

3年前 评论
维C (楼主) 3年前

错别字最好改一下 idnex->index

3年前 评论
维C (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!