一文解答什么是MySQL的回表
作者:m0_67403073 时间:2024-01-18 02:41:56
引言
简单来说,回表就是 MySQL 要先查询到主键索引,然后再用主键索引定位到数据。
下面,对一些问题进行分析与回答:
什么是聚簇索引?什么是非聚簇索引?
为什么回表要先查到主键索引?
主键索引和非主键索引有什么区别?
如何避免回表?
聚簇索引和非聚簇索引是什么?
MySQL 的索引有不同的角度的分类方式,例如:按数据结构分、按逻辑角度分、按物理存储分。
其中,按物理存储分有两种索引:聚簇索引和非聚簇索引。
简单来说,聚簇索引是主键索引。
主键索引之外的就是非聚簇索引,非聚簇索引又叫辅助索引或者二级索引。
主键索引和非主键索引有什么区别?
相同点:都使用的是 B+Tree 。
不同点:叶子节点存储的数据不同
主键索引的叶子节点存储的是一行完整的数据;
非主键索引的叶子节点存储的是主键值。叶子节点不包含记录的全部数据,非主键的叶子节点除了用来排序的 key 还包含一个书签(bookmark),其中存储了聚簇索引的 key。
那么这两种索引在使用方面上有什么区别呢?
使用主键索引查询:
# 主键索引的的叶子节点存储的是**一行完整的数据**,
# 所以只需搜索主键索引的 B+Tree 就可以轻松找到全部数据
select * from user where id = 1;
使用非主键索引查询:
# 非主键索引的叶子节点存储的是**主键值**,
# 所以MySQL会先查询到 name 列的索引的 B+Tree,搜索得到对应的主键值
# 然后再去搜索该主键值查询主键索引的 B+Tree 才可以找到对应的数据
select * from user where name = 'Jack';
可以看出使用非主键索引要比主键索引多使用一次 B+Tree。
B-Tree 和 B+Tree 的简单理解
理解聚簇索引和非聚簇索引的关键在于 B+Tree 的理解。
用一幅图来表示,其它的就不再过多解释了:
这里只是简单介绍一下 B-Tree 和 B+Tree 的区别:
B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
如何避免回表?
使用覆盖索引,所谓覆盖索引就是指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了。
来源:https://blog.csdn.net/m0_67403073/article/details/126080893
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
python中的Elasticsearch操作汇总
Python使用enumerate获取迭代元素下标
python绘制彩虹图
![](https://img.aspxhome.com/file/2023/1/135101_0s.jpg)
浅谈Python peewee 使用经验
Python数据结构之队列详解
![](https://img.aspxhome.com/file/2023/5/76795_0s.png)
javascript 词法作用域和闭包分析说明
![](https://img.aspxhome.com/file/2023/8/136458_0s.jpg)
Python利用reportlab实现制作pdf报告
![](https://img.aspxhome.com/file/2023/9/126949_0s.jpg)
Python 用户登录验证的小例子
Windows下MySQL8.0.11社区绿色版安装步骤图解
![](https://img.aspxhome.com/file/2023/3/115313_0s.png)
Python实现JSON反序列化类对象的示例
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
ThinkPHP学习笔记(一)ThinkPHP部署
asp显示字符串前5个文字
简单谈谈axios中的get,post方法
ASP编写完整的一个IP所在地搜索类
python简单实现插入排序实例代码
![](https://img.aspxhome.com/file/2023/5/134575_0s.png)