一文解答什么是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主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
mysql sock文件存储了什么信息
Jul 15 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 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应用提速面面观
2006/10/09 PHP
mysql建立外键
2006/11/25 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python闭包思想与用法浅析
2018/12/27 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
大学生毕业求职的自我评价
2013/09/29 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
市场营销战略计划书
2014/05/06 职场文书
好的旅游活动方案
2014/08/19 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
治庸问责工作总结
2015/08/11 职场文书
初中思想品德教学反思
2016/02/24 职场文书
离婚协议书格式范本
2016/03/18 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis