MySQL回表查询

Mysql回表查询:深入解析与实战应用 回表查询(Lookup Query)是指在使用非聚集索引(Non-Clustered Index)进行查询时,如果需要获取的数据不在索引页中,就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。这个过程称为“回表”。通过以上讲解,我们深入了解了Mysql中的回表查询。回表查询是使用非聚集索引进行查询时,如果需要获取的数据不在索引页中,就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。理解回表查询的工作原理和优化方法,有助于我们更好地优化数据库性能和设计高效的数据库模式。 阅读详情

在读这篇文章的开始先布置个作业,欢迎在评论区互怼!

SQL优化
问:假设有一张订单表order,主要包含了主键order_no,订单状态status,提交事件create_time等列,并且创建了status列索引和create_time列索引。此时通过create_time降序获取状态为1的订单编码。以下是具体实现代码;

select order_no from order where status=1 order by create_time desc

针对这条sql代码,还有哪些优化空间?







在这里插入图片描述












各位大佬们有什么思路嘛,还是说一脸懵??哈哈哈,话不多说,往下看。

你可能从来都没有听说过回表一词,但是你在实际工作中肯定用过回表。
如果还没有听过回表,那我相信不管你看多少 SQL 优化的知识,都还只是停留在表面。(说完感觉得罪了一个亿的程序员…)





在这里插入图片描述





一条SQL语句的查询过程

我们先来看看什么是回表?


通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。


根据这个概念,当你使用 Explain 执行查询计划时,当结果中 Extra 出现了 using index、using where、using index condition 等你就认为使用了过滤条件,使用了索引,SQL 优化的还不错。这其实是一种错误的认识。
因为,使用了索引并不代表查询就最优。从 using index condition、using index & using where 等可以看出,这条 SQL 语句其实是进行了回表的。


还有些时候,你查看 Explain 执行计划后,发现明明走了索引,为什么还是慢?这里面可能就是存在回表了。下面我们通过一个例子来说明什么是回表。先创建一张表,sql 语句如下:


create table order(
    id int primary key, 
    order_no varchar(15) DEFAULT NULL COMMENT '订单号', 
    status tinyint(2) DEFAULT '0' COMMENT '提交状态',
    create_time timestamp NULL DEFAULT NULL COMMENT '创建时间'
    index (status),
    index (create_time)
)engine = InnoDB;

然后,我们再执行下面的 SQL 语句,插入几条测试数据。


INSERT INTO ORDER
    ( id, order_no, status, create_time )
VALUES
	( 1, 111, 1, '2020-11-20 07:28:31' ),
	( 2, 222, 0, '2020-11-20 07:28:31' ),
	( 3, 333, 0, '2020-11-20 07:28:31' );

假设,现在我们要查询出 id 为 2 的数据。那么执行 select * from order where id = 2; 这条 SQL 语句就不需要回表。原因是根据主键的查询方式,则只需要搜索id 这棵 B+ 树。主键是唯一的,根据这个唯一的索引,MySQL 就能确定搜索的记录。


但当我们使用 status 这个索引来查询 status = 1 的记录时的订单号order_no就要用到回表。select order_no from order where status = 1; 原因是通过 status 这个普通索引查询方式,则需要先搜索 status 索引树,然后得到主键 id 的值为 1,再到 id 索引树搜索一次才能获取到这条记录从而得到order_no。这个过程虽然用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。


也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。


我这里表里的数据量比较少,如果数据量大的话,你能很明显的看出两次查询所用的时间,很明显使用主键查询效率更高。


看到这里应该对回表有了点理解吧。那么文章开头的问题有头绪了嘛????
来评论区互怼吧
在这里插入图片描述

EXPLAIN分析回表查询问题 mysql索引有两种:主键索引,其实就是聚簇索引;主键索引之外,其他的都称之为非主键索引,非主键索引也被称为二级索引,或者叫作辅助索引。对于主键索引和非主键索引,使用的数据结构都是 B+Tree,唯一的区别在于叶子结点中存储的内容不同:主键索引的叶子结点存储的是一行完整的数据。非主键索引的叶子结点存储的则是主键值。当我们需要查询的时候:如果是通过主键索引来查询数据,例如 select * from user where id=100,那么此时只需要搜索主键索引的 B+Tree 就可以找到数据。 阅读详情

相关推荐

Mysql 回表查询,什么是回表查询,如何拒绝sql查询时的回表问题

sql

zhangfuping123456789的博客 2228

mysql回表查询

通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。 根据这个概念,当你使用 Explain 执行查询计划时,当结果中 Extra 出现了 using ind...

weixin_42043101的博客 5290

大模型时代必备技能:3种向量量化技术对比(PQ/AQ/RVQ)与选型指南

本文深入解析了大模型时代处理海量向量数据的关键技术——向量量化。通过对比Product Quantization (PQ)、Additive Quantization (AQ)和Residual Vector Quantization (RVQ)三种主流技术的核心原理、性能表现与适用场景,为工程师提供了从理论到实践的选型指南,旨在解决向量存储与检索的效率瓶颈,助力RAG等大模型应用高效落地。

silver的专栏 796

什么是回表查询?怎样避免回表查询?

在数据库查询过程中,回表查询是一个常见但容易被忽视的性能瓶颈。对于数据库开发者和管理员来说,了解回表查询的概念及其影响是至关重要的。本博客将深入探讨回表查询的含义、产生原因以及对数据库性能的影响,并分享一些有效的避免回表查询的方法。通过阅读本文,读者将能够更好地优化数据库查询,提高系统性能,避免潜在的性能瓶颈。在本篇博文中,我已经结合 SQL 语句深入探讨了回表查询的含义,并分享了一些有效的避免回表查询的方法。

weixin_67589420的博客 5649

PFC胶结模型实战:从线性到平行粘结的力学行为解析

本文深入解析了PFC中线性接触与平行粘结(pb模型)的核心差异与应用。平行粘结模型通过模拟胶结层的力学行为,能够有效传递拉力和抵抗弯矩,是模拟岩石、混凝土等胶结材料的关键。文章详细介绍了其变形与强度参数的设置、法向与切向行为的验证方法,并揭示了全量与增量力计算中易出现的“幽灵力”问题及其解决方案,为复杂模型的构建与调试提供了实用策略。

weixin_29230773的博客 1203

Synopsys的CoreConsultant使用简析

CoreConsultant使用简析

weixin_58165606的博客 1万+

什么是回表查询

什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通索引有什么差异? InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引: (1)如果表定义了PK,则PK就是聚集索引; (2)如果表没有定义PK,则第一个not NULL unique列是聚集索引; (3)否则,InnoDB会创建一个隐..

我真的睡不够 2万+

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

Mysql回表查询

在MySQL数据库中,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行。在MySQL的InnoDB存储引擎中,每个索引项的最大长度是767字节,如果查询需要返回的字段长度超过了该限制,同样会触发回表操作。(2)由于查询返回的数据是*,所以此时,还需要根据主键值10,到聚集索引中查找10对应的记录,最终找到10对应的行row。回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取数据的方式,就称之为回表查询。

heming20122012的专栏 1067

滞回比较器电路详细分析

滞回比较器是一种用于检测两个不同电压值并使比较器输出高电平或低电平的电路。滞回比较器的特点是具有迟滞特性,即当输入电压高于某一阈值时,比较器输出高电平,当输入电压低于另一阈值时,比较器输出低电平,而在这两个阈值之间,比较器的输出保持不变。比较器通常有两个模拟电压输入端UIN+和UIN-以及一个数字状态输出端UOUT。当UIN+大于UIN-时,UOUT为高电平;当UIN+小于UIN-时,UOUT为低电平。根据具体的系统定义,这两种电位的具体数值可以有所不同。

LuDvei的博客 2万+

ENS160传感器原理图设计,已量产(空气质量传感器)

ENS160 是一款集成式数字空气质量传感器,核心优势源于 “MEMS 传感元件 + 内置微处理器” 的架构。

不脱发的程序猿 569

【mysql】MySQL中的回表查询、索引覆盖、索引下推、谓词下推

索引下推(INDEX CONDITION PUSHDOWN,简称 ICP)是在 MySQL 5.6 针对扫描二级索引的一项优化改进。总的来说是通过把索引过滤条件下推到存储引擎,来减少 MySQL 存储引擎访问基表的次数以及 MySQL 服务层访问存储引擎的次数。ICP 适用于 MYISAM 和 INNODB,本篇的内容只基于 INNODB。(1)MySQL 服务层:也就是 SERVER 层,用来解析 SQL 的语法、语义、生成查询计划、接管从 MySQL 存储引擎层上推的数据进行二次过滤等等。

weixin_44823875的博客 5877

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

庖丁解牛:MySQL回表查询原理深度解析与性能影响

MySQL中的回表查询是指在使用二级索引查找数据时,因索引未包含查询所需全部列,需要根据主键值再次访问聚簇索引获取完整行数据的操作。该机制由二级索引仅存储索引列和主键值的特性决定,会导致额外磁盘I/O和性能损耗。典型场景包括:查询条件使用二级索引但返回列超出索引范围。优化核心在于创建覆盖索引(包含所有查询列),减少SELECT*查询,以及利用索引下推技术。理解回表机制对索引设计和SQL优化至关重要,通过EXPLAIN分析可识别是否发生回表。

shitou的博客 952

微信小程序爬虫终极指南:以电商小程序抓包与逆向分析为例(最新版)

在2026年的移动互联网生态中,微信小程序已经成为电商交易的核心载体之一。据统计,超过78%的头部电商平台都推出了微信小程序版本,其用户活跃度甚至超过原生App。对于数据从业者而言,小程序端往往藏着比Web端更丰富的接口数据——包括但不限于商品详情、价格波动、用户评价、库存变化、秒杀活动信息等。与传统的Web爬虫不同,微信小程序爬虫面临着三大核心挑战无URL地址栏:无法通过浏览器直接查看网络请求wx.request封装:所有请求均通过微信原生API发起,难以直接拦截然而,

2201_76125261的博客 536

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MySQL的SELECT *查询必然会回表吗?

比喻理解:比如你去图书馆找书,先查目录(索引)找到书的位置编号(主键),再根据编号去书架找书(数据行)——这个"从目录到书架"的过程就是回表。SELECT *是否回表,取决于索引是否包含所有查询字段。MySQL的设计目标是让索引尽可能"覆盖"查询需求,减少磁盘访问(因为磁盘比内存慢10万倍)。所以写SQL时,尽量只查需要的字段,并合理设计索引,让查询像"查字典目录直接找到答案"一样高效。

长风破浪会有时的博客 717

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql 回表查询(二次查询,如何检查,如何规避)

mysql回表查询,如何检测,如何避免

pan303507479的博客 1427

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql中的回表查询与索引覆盖

了解一下MySQL中的回表查询与索引覆盖。 回表查询 要说回表查询,先要从InnoDB的索引实现说起。InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Secondary Index)。 InnoDB的聚集索引 InnoDB聚集索引的叶子节点存储行记录,因此InnoDB必须要有且只有一个聚集索引。 1.如果表定义了PK(Primary ...

weixin_30487201的博客 2096

MySQL中的回表查询、索引覆盖、索引下推

本文重点介绍索引中的常见概念:回表查询、索引覆盖、索引下推。

SHI940637335的博客 1542

mysql 回表_什么是MYSQL回表查询

select id,name where name=‘shenjian’select id,name,sex where name=‘shenjian’多查询了一个属性,为何检索过程完全不同?什么是回表查询?什么是索引覆盖?如何实现索引覆盖?哪些场景,可以利用索引覆盖来优化SQL?这些,这是今天要分享的内容。画外音:本文试验基于MySQL5.6-InnoDB。一、什么是回表查询?这先要从InnoD...

weixin_36114091的博客 1907

mysql查询回表什么意思_什么是MYSQL回表查询

select id,name where name=‘shenjian’select id,name,sex where name=‘shenjian’多查询了一个属性,为何检索过程完全不同?什么是回表查询?什么是索引覆盖?如何实现索引覆盖?哪些场景,可以利用索引覆盖来优化SQL?这些,这是今天要分享的内容。画外音:本文试验基于MySQL5.6-InnoDB。一、什么是回表查询?这先要从InnoD...

weixin_39815310的博客 4401
上一篇: docker可视化图形工具Portainer
下一篇: Spring Cloud底层原理
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值