[编程技术] 后端面试之MySQL-什么是回表查询和覆盖索引
作者:CC下载站 日期:2021-11-26 00:00:00 浏览:5 分类:编程开发
后端面试系列将剖析后端面试中常考技术点,用尽量短的篇幅把一个一个技术点呈现出来。
背景
关于回表查询,是MySQL里面一个非常重要的知识点。理解回表查询,让你在实际项目中操作数据库的时候会有更好的性能考虑。
回表查询也是我面试必考的一个基础知识。
什么是回表查询?
这先要从InnoDB的索引实现说起,InnoDB有两大类索引:
- 聚集索引(clustered index) - 非叶子节点存储的是表的主键;叶子节点存储着当前主键对应的行记录;
- 普通索引(secondary index) - 非叶子节点存储的是自己设置的索引字段对应的值(如果是联合索引,那就是联合索引的几个字段对应的值);叶子节点,只存储当前记录对应的主键ID(聚集索引的非叶子结点的值)。
普通索引也叫非聚集索引。
InnoDB必须要有,且只有一个聚集索引:
- 如果表定义了PK,则PK就是聚集索引;
- 如果表没有定义PK,则第一个not NULL unique列是聚集索引;
- 否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
我们假设有一个表 student_tab
:
1
2
3
4
5
6
7
CREATE TABLE `student_tab`(
`id` INT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`age` INT UNSIGNED NOT NULL,
PRIMARY KEY ( `id` ),
INDEX `idx_name` (`name`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
注:
- 主键(PK): id (聚集索引)
- 普通索引:name (非聚集索引)
什么时候回表?
当我们查询语句如下的时候:
1
select id, name, age from student_tab where name = `Bob`;
的时候,就会出现 回表查询。
为什么呢?
因为:普通索引叶子结点只储存当前记录对应的主键ID。我们通过普通索引 name = Bob
查找记录,找到最终 id = 13
, 但是我们最终返回的数据还有 age
,这个时候只通过普通索引无法返回我们需要的所有数据,就需要回到聚集索引里面查找。
这就是 回表查询。
使用普通索引查询都是回表查询吗?
不是的。
当你的查询条件为这样:
1
select id, name from student_tab where name = `Bob`;
需要的数据 id, name
通过普通索引都可以得到,就不会回表。
怎么避免回表查询呢?
如果我又想需要age,又不想回表查询,该怎么办呢?
简单, 给 name和age建立一个联合索引替换掉 idx_name
索引。
1
INDEX `idx_name_age` (`name`, `age`)
当使用
1
select id, name, age from student_tab where name = `Bob`;
查询的时候,name和age在一个联合索引上,所以在普通索引上是有age的信息的,这个时候就不需要回表。
这就引入了下个问题,什么是覆盖索引。
什么是覆盖索引?
覆盖索引是一种避免回表查询的优化策略。具体做法就是将要查询的数据作为索引建立普通索引。 只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
1
2
3
4
ALTER TABLE student_tab DROP INDEX idx_name;
ALTER TABLE student_tab ADD INDEX idx_name_age(name, age);
select id, name, age from student_tab where name = `Bob`;
流程为:
- 在name,age联合索引树上找到名称为
Bob
的节点 - 此时节点索引里包含信息
name, age
, 节点对应的值为 主键索引id
。 - 包含我们所需要的所有信息,索引覆盖,无需回表。
确定数据库成功使用了覆盖索引呢?
使用explian查看 Extra 列是否是 Using index
。
Using index means that all information is returned from the index, without seeking the records in the table. This is only possible if all fields required by the query are covered by the index.
意思是:Using index是指所有的信息可以从index里面返回,不需要从table中寻找记录。当且仅当所有查询需要的字段都覆盖在索引里面的时候才会存在。
当这个表有 索引 INDEX idx_name (name)
时:
1
2
explain select id, name from student_tab where name = `Bob`;
explian select id, name, age from student_tab where name = `Bob`;
发现如果查询 age
的时候是无法使用覆盖索引的。
当这个表有 索引 INDEX idx_name_age (name, age)
时:
explian select id, name, age from student_tab where name = `Bob`;
可以看到,Extra = Using index
,这个时候就可以使用覆盖索引。
<全文完>
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[课程] Kali安全渗透+Web白帽子高级工程师+黑客攻防 - 带源码课件
[课程] 最用心全面的VIP硬笔书法课程(共250课完结) 手把手教 附可打印控笔素材
[MV] 韩国女团MV398首[打包]
[电影] 2023年美国喜剧片《问题专家》HD中英双字
[电影] 1999年美国经典传记片《十月的天空》蓝光中英双字
[影视] 破墓 WEB-DL版下载/Exhuma/The Unearthed Grave 2024 파묘 6.61G
[影视] 问题专家 WEB-DL版下载/大麻烦家(台) 2023 Problemista 18.2G
[短剧] 10部午夜小短剧 擦边剧
[电影] 2022年日本7.0分科幻片《疯狂星期一》BD日语中字
[电影] 2024年英国爱情片《血爱成河》BD中英双字
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[云资源] 价值2万元的老男孩Python教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[云资源] 花了一千多元买的私人健身教程
[下载工具] Internet Download Manager 6.42.7 (IDM)
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[即时通讯] 腾讯QQ PC版9.7.22.29315去广告绿色纯净版
[开发环境] PhpStorm2023中文激活版v2023.3.3 正式版
[资料] 3000 套电影电视剧 LOGO 宣传片常用音效合集包
[安卓软件] 酷我音乐APP_v10.7.6.4 去广告破解豪华VIP版
[云资源] 价值2万元的老男孩Python教程
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[云资源] 花了一千多元买的私人健身教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[动画] 北斗神拳(1984) [两季合集] [MKV]
[资料] 抗战阵亡将士资料+续编
[电视剧] 三体 (2024) 全8集 网飞版本 中文字幕 合集
[影视] 三大队 WEB-DL版下载/Endless Journey/请转告局长,三大队任务完成了 2023 三大队 6.7G
[纪录片] 河西走廊【10集 国语 中文字幕 1080P 10.8G MP4】
[安卓软件] OfficeSuite中文版APP v14.2.50872.0破解版
- 最新评论
-
我想看看mw2ddyy 评论于:04-26 好东西阿zfy123123 评论于:04-18 谢谢楼主xiaoqi 评论于:04-12 勿在线解压,勿手机解压,请在电脑上用最新款压缩软件解压!推荐360压缩或者好压CC下载站 评论于:04-10 无法解压啊,客服能不能给个解压教程ravengrey 评论于:04-10 谢谢支持!!CC下载站 评论于:03-26 很棒的资源,感谢分享云体风身 评论于:03-26 感谢分享,好东西云体风身 评论于:03-26 谢谢支持!CC下载站 评论于:03-14 央视精品,感谢付出提供。qwer9009 评论于:03-14
- 热门tag