一文解答什么是MySQL的回表


Posted in MySQL onAugust 05, 2022

引言

简单来说,回表就是 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 的理解。

用一幅图来表示,其它的就不再过多解释了:

一文解答什么是MySQL的回表

这里只是简单介绍一下 B-Tree 和 B+Tree 的区别:

  • B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
  • B+树中所有叶子节点都是通过指针连接在一起,而B树不会。

如何避免回表?

使用覆盖索引,所谓覆盖索引就是指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了。

到此这篇关于一文解答什么是MySQL的回表的文章就介绍到这了,更多相关MySQL回表内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL pt-slave-restart工具的使用简介
Apr 07 MySQL
MySQL update set 和 and的区别
May 08 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
mysql sock文件存储了什么信息
Jul 15 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 #MySQL
SQLServer常见数学函数梳理总结
Aug 05 #MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 #MySQL
面试官问我Mysql的存储引擎了解多少
MySQL索引失效场景及解决方案
Jul 23 #MySQL
MySQL添加索引特点及优化问题
Jul 23 #MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 #MySQL
You might like
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
js判断节假日实例代码
2017/12/27 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
使用python模拟命令行终端的示例
2019/08/13 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
Python实现图像的垂直投影示例
2020/01/17 Python
python生成大写32位uuid代码
2020/03/03 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
python中round函数保留两位小数的方法
2020/12/04 Python
优秀员工自荐书
2013/12/19 职场文书
学校门卫管理制度
2014/01/30 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
个人培训总结
2015/03/05 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
2015小学师德工作总结
2015/07/21 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python