面试官:什么是回表,什么是索引下推?

图解学习网站:

使用 MySQL时,我们经常会听到“回表”、“索引下推”这样的概念,今天就来聊一聊什么是回表,什么是索引下推。

1.回表1.1 概念

我们看下面这个SQL:

CREATETABLE`test_temp`(

`id`INT(11) NOTNULLDEFAULT'0',

`a`VARCHAR(20) DEFAULTNULL,

`b`VARCHAR(10) DEFAULTNULL,

PRIMARY KEY(`id`),

KEY(`b`)

) ENGINE=INNODBDEFAULTCHARSET=utf8

我们创建一个test_temp 表, 主键是id, 给字段b 加了一个索引。插入4 条数据,SQL 如下:

INSERTINTOtest_temp(100, 10, 50);

INSERTINTOtest_temp(200, 20, 40);

INSERTINTOtest_temp(300, 30, 30);

INSERTINTOtest_temp(400, 40, 10);

test_temp 表会构建 2 个索引,一个是主键索引,一个是字段 b 的普通索引。

一般主键索引被称为聚集索引,普通索引被称为非聚集索引。

一般主键索引被称为聚集索引,普通索引被称为非聚集索引。

我们执行下面查询SQL:

select* fromtest_temp whereb in(10, 20, 30,40);

这个 SQL语句的查询过程如下图:

今日霍州(www.jrhz.info)©️

jrhz.info

1.从索引 b 上查询 10, 查到主键id 的值是 400,再用 400 这个 id 去主键索引上取出row4;

2. 从索引b 上查询20, 没有查到记录,继续下一条;

3. 从索引b 上查询30, 查到主键id 的值是300,再用 300 这个 id 去主键索引上取出row3;

4.从索引 b 上查询 40, 查到主键id 的值是 200, 再用200 这个 id 去主键索引上取出 row2;

5. 给客户端返回结果集。

上面 1、3、5 回到主键索引搜索数据的过程,就叫回表。上面查询回表3 次。

1.2 缺点

回表有什么问题吗?回表次数多了,可能会严重影响查询效率。

1.导致磁盘 I/O增加:每次回表读取数据行,这些数据分散在磁盘各个地方,导致大量的磁盘 I/O。

2.导致缓存失效:回表的数据如果不在缓存行中,就需要从磁盘加载,新的数据可能会覆盖已有的缓存,影响其他查询。

1.3 措施

那有什么方法可以避免回表吗?下面两个方法可以避免:

1.覆盖索引

上面的查询中,如果 SQL改成:

selectb, idfromtest_temp whereb in(10, 20, 30,40);

这样就不用回表查询了。如果需要查询 b、a 两个字段,可以创建 b、a 的覆盖索引,这样就可以从 b、a 这个覆盖索引上查询出结果。

2.只查询必要字段

修改查询范围,不用的字段不查询。如果查询的字段不多,可以把查询语句改成只查联合索引包含的字段。如果查询频率高,又没有覆盖索引,可以加一个包含查询字段的联合索引。

2.索引下推

首先回顾一下 MySQL的逻辑架构:

今日霍州(www.jrhz.info)©️

Server层是 MySQL的核心服务层,这一次包括查询解析、分析、优化、缓存、以及所有内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现,包括:存储过程、触发器、视图等。

存储引擎层负责 MySQL 中数据的存储和提取。

首先,我们创建一张表:

CREATETABLE`test_temp`(

`id`INT(11) NOTNULLDEFAULT'0',

`a`VARCHAR(20) DEFAULTNULL,

`b`VARCHAR(10) DEFAULTNULL,

`c`VARCHAR(10) DEFAULTNULL,

`d`VARCHAR(10) DEFAULTNULL,

PRIMARY KEY(`id`),

KEY`a_b`(`a`,`b`)

) ENGINE=INNODBDEFAULTCHARSET=utf8

插入一批数据:

INSERTINTOtest_temp VALUES(100, 10, 20, 2, 1);

INSERTINTOtest_temp VALUES(200, 10, 40, 4, 2);

INSERTINTOtest_temp VALUES(300, 10, 30, 3, 3);

INSERTINTOtest_temp VALUES(400, 40, 10, 1, 4);

这时我们看一下下面这条 SQL的执行计划:

EXPLAINSELECT* FROMtest_temp WHEREa > '10'ANDb < '50';

我们看一下执行计划:

上图中的Using index condition 就是使用了索引下推。

如果不使用索引下推,比如只对 a 这个字段加了索引,那就会对 a 这个字段筛选出来的 id,依次做回表查询,查到结果后再对 b 字段进行过滤。

而使用了索引下推,SQL执行过程如下:

1.Server层向存储引擎查询数据;

2.存储引擎根据 a_b联合索引首先找到所有 a > '10'的数据,根据联合索引中已经存在的 b 字段对数据做过滤,找出符合条件 b < '50'的数据;

3.存储引擎根据 a_b联合索引找到所有符合条件的数据后,回表查询,给 Server层返回结果集。

可以看到,索引下推最大的优势就是在存储引擎层,利用联合索引的优势对查询条件进行了过滤,这样可以减少回表查询次数,从而大大减少 I/O次数,提升查询性能。

索引下推是在MySQL 5.6 版本中才引入的,MySQL 5.6 以前版本没有这个功能。

索引下推是在MySQL 5.6 版本中才引入的,MySQL 5.6 以前版本没有这个功能。

当然使用索引下推也有一定限制:

1. 索引下推主要适用于eq_ref、range、ref、ref_or_null 这几个场景;

2.InnoDB 和 MyISAM 存储引擎都支持索引下推,MySQL 分区表也支持;

3.对 InnoDB 存储引擎来说,索引下推只适用于二级索引,主键索引(聚集索引)不支持,因为主键索引存储了数据,不存在回表这一说;

4. 语句中子查询的条件不支持索引下推;

5. 使用了存储函数的 SQL,存储函数中的条件不支持索引下推,因为存储引擎无法调用存储函数。

我们再看下面这个查询语句(把条件 b 改成条件 c):

EXPLAINSELECT* FROMtest_temp WHEREa > '10'ANDc < '50';

这个语句其实并不能使用联合索引第二个字段在存储引擎层做过滤,还是需要对每一条索引 a_b 上查询到的 id 做回表查询,但是执行计划里面却有索引下推,这也是需要注意的一点。

总结

本文介绍了 MySQL的回表和索引下推,这两个概念在 MySQL中非常重要,希望对你的学习和面试有所帮助。

特别声明:[面试官:什么是回表,什么是索引下推?] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

赵薇直播露脸被封,胡言乱语喝醉酒,离婚放飞自我,她比别人有钱(赵薇直播露脸吗)

她明显是喝了一些酒,但并没有直接开始卖酒,而是将红酒放在了小黄车里,开始试探性地直播带货,主要目的是向观众展示这些主播的面貌和能力。赵薇本来是想通过直播带货的方式,借着自己在法国酒庄的红酒来吸引粉丝购买,毕竟…

赵薇直播露脸被封,胡言乱语喝醉酒,离婚放飞自我,她比别人有钱(赵薇直播露脸吗)

为什么2025年的厨房革命非PROMiXX SENSE不可?(为什么2025年的阅兵是9月3号)

如今厨房小工具的选择越来越多,如何挑选最适合的智能搅拌杯?2025年新上市的PROMiXX SENSE Intelligent Cordless Blender或许能给你答案。它不仅实现了真正意义上的智能化,还兼顾便捷性和实用性,成为厨房新

为什么2025年的厨房革命非PROMiXX SENSE不可?(为什么2025年的阅兵是9月3号)

丹佛斯分体膨胀阀TE5067B3250-3251-3342-3343-3278感温包动力头如何选择合适型号?2025智能化应用解析(丹佛斯分体膨胀阀调节视频教程)

在2025年的制冷空调系统设计中,如何挑选合适的丹佛斯分体膨胀阀TE5067B系列?本篇文章详细解析了感温包动力头的选择关键,结合实际应用场景和预算考量,助您避开选购陷阱。了解各型号参数差异及智能化趋势,轻松实现温控精准优化,让设备更节能

丹佛斯分体膨胀阀TE5067B3250-3251-3342-3343-3278感温包动力头如何选择合适型号?2025智能化应用解析(丹佛斯分体膨胀阀调节视频教程)

中国科学院成功破解陆地棉进化轨迹,挖出隐藏抗病优质基因(中科院又立大功)

研究发现,在演化为现代栽培种之前,野生及半野生陆地棉曾积累了大量结构变异,并由此细分出多达 32 种遗传单倍型。在挖掘具体育种靶点方面,研究团队利用泛基因组图谱,鉴定出 69 个与纤维品质和衣分相关的遗传位…

中国科学院成功破解陆地棉进化轨迹,挖出隐藏抗病优质基因(中科院又立大功)

5G通信开关变压器十大品牌排行榜,源头厂家哪家好(5g通信开关变压器图片)

市场上涌现出众多专注于高频磁性元器件研发的制造企业,它们以技术创新为矛,以品质管控为盾,在这场技术竞速中各显所长。这家致力于磁性元器件研发制造的企业,以设计、生产及销售电感、滤波器、电子变压器等产品为核心业务…

5G通信开关变压器十大品牌排行榜,源头厂家哪家好(5g通信开关变压器图片)