一文解答什么是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 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySql开发之自动同步表结构
May 28 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
一文解答什么是MySQL的回表
Aug 05 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应用技巧
2008/03/27 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php数组删除元素示例
2014/03/21 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
Python之web模板应用
2017/12/26 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
中学门卫岗位职责
2013/12/26 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
二人合伙经营协议书
2014/09/13 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
5.12护士节活动总结
2015/02/10 职场文书
高中教师个人工作总结
2015/02/10 职场文书
送达通知书
2015/04/25 职场文书
小学班主任心得体会
2016/01/07 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
Nginx源码编译安装过程记录
2021/11/17 Servers
Go gorilla/sessions库安装使用
2022/08/14 Golang