首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >为什么使用覆盖索引就可以避免回表操作?

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

作者头像
星哥玩云
发布2022-08-18 19:18:19
发布2022-08-18 19:18:19
1.4K0
举报
文章被收录于专栏:开源部署开源部署

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

首先弄明白两个概念-大概说一下,具体的网上都有: 覆盖索引-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列建立联合索引,其他列暂时没有建立索引。

a

b

c

d

e

1

15

16

17

x

2

25

26

27

x

3

35

36

37

x

4

45

46

47

x

5

55

56

57

x

6

65

66

67

x

7

75

76

77

x

8

85

86

87

x

执行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列值了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档