一文解答什么是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 InnoDB存储引擎的内存管理
Apr 08 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
深入解析MySQL索引数据结构
Oct 16 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 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
Dedecms常用函数解析
2008/02/01 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
使用Python写一个小游戏
2018/04/02 Python
Python处理中文标点符号大集合
2018/05/14 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
工程项目经理岗位职责
2013/12/15 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
多媒体教室标语
2014/06/26 职场文书
2014年党小组工作总结
2014/12/20 职场文书
《赵州桥》教学反思
2016/02/17 职场文书