一文解答什么是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 infobright的安装步骤
Apr 07 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL 全文索引使用指南
May 25 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
MySQL查询日期时间
May 15 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
mysql sql常用语句大全
Jun 21 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
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采用session实现防止页面重复刷新
2015/12/24 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
JavaScript 实现继承的几种方式
2021/02/19 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
python生成excel的实例代码
2017/11/08 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
Java的五个基础面试题
2016/02/26 面试题
送货司机岗位职责
2013/12/11 职场文书
广告学专业求职信
2014/06/19 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
基于Python实现一个春节倒计时脚本
2022/01/22 Python
python三子棋游戏
2022/05/04 Python