一文解答什么是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创建索引需要了解的
Apr 08 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
MySQL 分页查询的优化技巧
May 12 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
浅谈mysql返回Boolean类型的几种情况
Jun 04 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL事务的ACID特性以及并发问题方案
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文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
angularJS 入门基础
2015/02/09 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python的faker库用法
2019/11/28 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
python爬取代理ip的示例
2020/12/18 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
外国语学院毕业生自荐信
2013/10/28 职场文书
业务主管岗位职责
2013/11/20 职场文书
个人自荐信
2013/12/05 职场文书
领导视察欢迎词
2014/01/15 职场文书
工程承诺书怎么写
2014/05/24 职场文书
文员求职信
2014/07/15 职场文书
单位活动策划方案
2014/08/17 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
python通过函数名调用函数的几种方法总结
2021/06/07 Python
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python