一文解答什么是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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
Jun 28 MySQL
delete in子查询不走索引问题分析
Jul 07 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
php图片上传存储源码并且可以预览
2011/08/26 PHP
php模板函数 正则实现代码
2012/10/15 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
js实现表格数据搜索
2020/08/09 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Python 爬虫性能相关总结
2020/08/03 Python
Python tkinter实现日期选择器
2021/02/22 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
幼儿园教师培训制度
2014/01/16 职场文书
水果超市创业计划书
2014/01/27 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python