阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

为什么使用覆盖索引就可以避免回表操作?

154次阅读
没有评论

共计 763 个字符,预计需要花费 2 分钟才能阅读完成。

保证给你讲明白,看不懂你砍我。

首先弄明白两个概念 - 大概说一下,具体的网上都有:
覆盖索引 select b,c,d from t1 ;
select b,c,d from t1 where b=1 and c =1 and d=1 ;
select a,b,c,d from t1 where b=1 and c =1 and d=1;
【a 是主键,给 bcd 建立联合索引】,如上几个 sql,select 出来的内容,和 where 条件字段,刚好和建立的索引一致.
回表- 使用非聚簇索引进行查找数据时,需要根据主键值去聚簇索引中再查找一遍完整的用户记录,这个过程叫做回表.

上面两个概念清楚以后,继续往下看。
新建一张测试表 t1. 如下。
备注:a 列设置为主键列,bcd 列建立联合索引,其他列暂时没有建立索引。

abcde
1151617x
2252627x
3353637x
4454647x
5555657x
6656667x
7757677x
8858687x

执行 sql,如下:
select b,c,d from t1 where b=15 and c=16 and d=17
这里使用了 覆盖索引。我们看下他的 B + 树。
为什么使用覆盖索引就可以避免回表操作?
分析上图,满足条件的结果,是不是完整的显示在了叶子节点上???【注意:我们 select 查询的内容不是全表,是 bcd 三个字段,在叶子节点上,这 3 个字段是不是都已经有对应的值了。】
即使我们 sql 写这样子:
select a,b,c,d from t1 where b=15 and c=16 and d=17
a 是主键列,但是在联合索引的叶子节点上,页存储了对应的主键值,所以依旧不需要回表操作。

总结:使用覆盖索引,我们需要 select 出来的列,都已经存在了索引树的叶子节点上。所以不需要回表操作,如果我们 select 出来的某列,不在该联合索引的叶子节点上(比如上表的 e 列),那就需要根据对应索引值,去聚簇索引树上回表查询对应的 e 列值了。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计763字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中