一文解答什么是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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL分库分表与分区的入门指南
Apr 22 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MySQL事务的隔离级别详情
Jul 15 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制作简单的内容采集器的代码
2007/11/28 PHP
坏狼的PHP学习教程之第1天
2008/06/15 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
python list转dict示例分享
2014/01/28 Python
python实现巡检系统(solaris)示例
2014/04/02 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
越南综合购物网站:Lazada越南
2019/06/10 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
党课心得体会范文
2014/09/09 职场文书
担保书范本
2015/01/20 职场文书
小学重阳节活动总结
2015/03/24 职场文书
小学教学工作总结2015
2015/05/13 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
学生病假条怎么写
2015/08/17 职场文书
vue修饰符.capture和.self的区别
2022/04/22 Vue.js