[编程技术] 后端面试之MySQL-什么是回表查询和覆盖索引
作者:CC下载站 日期:2021-11-26 00:00:00 浏览:23 分类:编程开发
后端面试系列将剖析后端面试中常考技术点,用尽量短的篇幅把一个一个技术点呈现出来。
背景
关于回表查询,是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
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[电影] 《环太平洋两部合集》 4K REMUX原盘 [杜比视界] 国英双语音轨 [内封特效字幕] [133.8G]
[电影] 异人之下 The Traveller 2024✨【影版】【4K正式版/HQ超高码/DDP5.1】✚【1080高码】无水印/无压缩
[动漫] 头文字D 动漫 (1998) S01-S06季 1080P 国粤日音轨 续作 剧场版 电影
[小说] 知轩藏书全站7667册txt小说合集精心校对版
[杂志] 电脑爱好者杂志14年 超全 [PDF]
[电影] 西游记全部版本-4K高清修复-总计384G-1986+1996+1998+2002+2010浙版+西游记后传
[纪录片] 【国家地理百年纪念典藏】超经典100集全 MP4格式 (绝佳学习资料)27GB
[纪录片] B站食贫道收费纪录片 *迷失东京* [1080P] 揭露日本大家感兴趣却不为人知的秘密
[网络线报] 城通网盘福利线报解析器 - 获取直连下载地址
[福利线报] 一个「脚本」搞定六大网盘(百度/阿里/天翼/迅雷/夸克/移动)
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[涨点姿势] 男性性技宝典:14招实战驭女术——爱抚、按摩、催情、姿势、高潮全攻略
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[游戏] 黑神话悟空离线完整版+修改器
[图像处理] 光影魔术手v4.6.0.578绿色版
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
[美图] 【经典收藏美图集合】1500多张韩国美女高清图片让你的收藏夹更加丰富多彩
- 最新评论
-
有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢WillKwok 评论于:10-09 感谢分享1234123 评论于:10-07 太好了终于找到了谢谢Tom 评论于:10-07 谢谢分享loonghd 评论于:09-30
- 热门tag