mysql优化-减少查询回表次数和回表数据量

news2025/2/27 3:23:49

减少数据回表常见的三种方式分别是1)查询条件使用聚集索引;2)使用索引下推;3)使用索引覆盖。

1 查询条件使用聚集索引-避免回表查询

按照索引使用数据结构B+树叶子结点是否包含表中全部字段,mysql 索引可以分为聚集索引和非聚集索引(辅助索引),聚集索引反应了记录在磁盘上存储的物理结构,辅助索引反应了记录的逻辑结构。聚集索引索引B+树叶子结点存储表所有字段属于聚集索引,查询索引可以直接获得所有字段信息,索引B+树叶子结点只存储聚集索引id,根据辅助索引查询全部字段时,首先根据辅助索引,查询到聚集索引,然后根据查询到的聚集索引id逐个回表查询记录完整信息。综上,使用聚集索引查询不用二次回表。

2 使用索引覆盖-避免回表查询

先有如下一个订单表,考虑需要经常查询某个用户购买某个商品的信息,所以设计了联合主键(user_id, spu_id)。

CREATE TABLE `order` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT,
	 `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
	 `spu_id` bigint(20) unsigned NOT NULL COMMENT 'SPUID',
	 ...
	 KEY `idx_userId_spuId` (`userId`,`spu_id`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='订单';

现需要查询一个用户下的所有spu_id:

select * from `order` where `user_id` = 123456; -- 方式1,从表中查询整条记录,然后在后端代码中提取spu_id
select `spu_id` from `order` where `user_id` = 123456; -- 方式2,只查询spu_id字段

相同点是,在数据量很大情况下,两种方式都会走索引idx_userId_spuId;不同点是,方式1,先根据辅助索引找到主键id(此时聚集索引建立在主键上),然后对每个主键id进行回表查询整条记录信息,方式2,因为联合索引恰好包含查询字段spu_id,避免了二次回表查询。

3 使用索引下推-减少回表次数

下面是一个用户表,同时在用户姓名和年龄创建了一个联合索引

CREATE TABLE `user_info` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT,
	 `name` varchar(512) unsigned NOT NULL COMMENT '姓名',
	 `age` bigint(20) unsigned NOT NULL COMMENT '年龄',
	 ...
	 KEY `idx_name_age` (`name`,`age`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='用户信息';

先需要查询18岁以下所有姓张的同学信息(场景好奇快😂):

select * from `user_info` where name like '张' and age < 18;

在mysql 5.6 之前,查询过程使用idx_name_age索引查询主键id,然后根据主键逐个回表(没在联合索引上使用age < 8条件,是使用联合索引字段作为查询条件,遇到非等值查询联合索引后续字段会失效),同时使用age < 8条件进行过滤,回表记录可能会因为age条件而在最终结果中过滤掉,这样,其实被过滤的记录要是不用回表可以减少二次回表次数,提高查询效率。在mysql 5.7 引入「索引下推」,查询过程变成,name走索引idx_name_age,同时继续直接使用age对索引进行过滤,需要回表查询的小部分记录都会包含在最终结果里面。

参考:

1 Mysql优化(十)什么是 MySQL 的 回表 ?怎么减少回表的次数?
2 MySQL聚集索引和非聚集索引
3 主键,聚集索引,不是一个东西!
4 Mysql性能优化:什么是索引下推?
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“数字中国·福启海丝”多屏互动光影艺术秀27日在福州举办

作为深化“数字海丝”的核心区、海上丝绸之路的枢纽城市&#xff0c;为喜迎第六届数字中国建设峰会盛大召开之际&#xff0c;福州市人民政府特此举办“数字中国福启海丝”多屏互动光影秀活动。本次光影秀活动是由福建省文化和旅游厅指导&#xff0c;福州市人民政府主办&#xf…

USB转串口芯片CH9101U

CH9101是一个USB总线的转接芯片&#xff0c;实现USB转异步串口。提供了常用的MODEM联络信号&#xff0c;用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。 特点 全速USB设备接口&#xff0c;兼容USB V2.0。内置固件&#xff0c;仿真标准串…

CH9121网络串口透传应用

概述 随着物联网技术的普及&#xff0c;越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口&#xff0c;串口转以太网&#xff0c;进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈&#xff0c;无需编程&#xff0c;即可轻松实现网络数据…

撰写项目文档: 节省时间的技巧和模板

高质量的项目文档具有长期价值。它不仅有助于确保项目的成功&#xff0c;而且还可以作为未来项目和计划的参考&#xff01; 项目文档是任何项目的脉搏&#xff0c;它连接了成功运行项目所需的一切。 文档必须足够宽泛&#xff0c;以便开发能够取得进展。但要足够灵活&#xf…

DAB-Deformable-DETR源码学习记录之模型构建(二)

书接上回&#xff0c;上篇博客中我们学习到了Encoder模块&#xff0c;接下来我们来学习Decoder模块其代码是如何实现的。 其实Deformable-DETR最大的创新在于其提出了可变形注意力模型以及多尺度融合模块&#xff1a; 其主要表现在Backbone模块以及self-attention核cross-atten…

平台+AI:全面拥抱大模型的商业创新,打造企业数字化「柔性供应链」 | D3演讲实录

马斯克曾说&#xff1a;“高生产率解决诸多问题。” 在社会化内卷的大环境下&#xff0c;借助数智化“降本增效”已是不争事实。AI技术日新月异、大量信息繁杂涌现&#xff0c;无数原来烟囱式的模式亟需变革&#xff0c;平台与AI之间怎样融合&#xff0c;才能发挥更大的功效&a…

深度学习量化总结(PTQ、QAT)

背景 目前神经网络在许多前沿领域的应用取得了较大进展&#xff0c;但经常会带来很高的计算成本&#xff0c;对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键&#xff0c;在这些场景中模型推理具有严格的功率和计算要求。神经网络…

如何减少项目在Corona和V-Ray中的3ds Max渲染时间?

相信在大多 3D 项目里&#xff0c;渲染是最耗费时间的部分&#xff0c;它不仅是建模和纹理化 3D 场景的过程&#xff0c;而是需要利用硬件来完成任务。我们在配备独立GPU和带有2到4个强大内核的CPU的中档计算机上&#xff0c;可以将3ds Max中创建和处理的项目轻松渲染完成&…

MATLAB实现车牌识别

车牌识别主要包括三个主要步骤&#xff1a;车牌区域定位、车牌字符分割、车牌字符识别。 本项目通过对拍摄的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程来进行车牌图像预处理&#xff0c;并由此得到一种基于车牌颜色纹理特征的车牌定位方法&#xff0c;最终实现了车牌…

在Docker上部署SpringBoot项目

在Docker上部署SpringBoot项目 在学习中发现了部署的时候总是有各种问题,此文章只有操作步骤没有原理解释,只是用来提醒自己部署步骤 第一步:将SpringBoot项目打包成jar包 使用idea打包,点一下就行 第二部:编写Dockerfile文件 新建一个名为Dockerfile的文件,注意没有后缀…

improper Integral反常积分

笔记 笔记二 例题 hyperlink

安陆EGS20 SDRAM仿真

目录 一. 搭建仿真平台 二. 实现SDRAM连续写入1024个数据&#xff0c;然后再连续读出&#xff0c;并比较 1. 调试过程中问题&#xff1a; 2. 顶层代码 3. 功能代码 三. SDRAMFIFO实现上述功能调试 1. 代码设计要点 2. 仿真过程问题 3. 上板运行调试 安陆反馈&#xf…

80%的人都关注的电子合同签署疑问,君子签官方解答来了!

电子合同签错了在平台可以撤回吗&#xff1f;如果合同上名字签错了&#xff0c;有法律效力吗&#xff1f;签的电子合同&#xff0c;内容会不会被别人看见&#xff1f;… 最近&#xff0c;小编将80%的人都关注的电子合同签署问题进行了整理&#xff0c;官方专业解答帮助大家更好…

mac真机调试h5攻略

原因&#xff1a; h5项目想在mac本通过chrome://inspect/#devices调试 &#xff08;win上调试h5很简单&#xff0c;请参考&#xff1a;chrome真机调试Android_chrome 调试安卓_芒果终结者的博客-CSDN博客&#xff09; 调试步骤&#xff1a; 1. 需要下载安装安卓开发工具and…

信息化发展

信息系统是&#xff1a;管理模型、信息处理模型和系统实现条件结合的 信息系统生命周期&#xff1a; 可行性分析与项目开发计划 需求分析 概要设计 详细设计 编码 测试 可以简化为&#xff1a; 系统规划&#xff1a;现行情况的分析&#xff0c;可行性研究报告 -> 设计任务…

Java笔记_13(集合进阶2)

Java笔记_13 一、双列集合1.1、Map的常见API1.2、Map遍历方式一&#xff08;键找值&#xff09;1.3、Map集合遍历方法二&#xff08;键值对&#xff09;1.4、Map集合遍历方法三&#xff08;lambda表达式&#xff09;1.5、HashMap1.6、HashMap练习1.7、HashMap底层源码解析1.7、…

12秒内AI在手机上完成作画!谷歌提出扩散模型推理加速新方法

本文源自&#xff1a;量子位 只需12秒&#xff0c;只凭手机自己的算力&#xff0c;就能拿Stable Diffusion生成一张图像。 而且是完成了20次迭代的那种。 要知道&#xff0c;现在的扩散模型基本都超过了10亿参数&#xff0c;想要快速生成一张图片&#xff0c;要么基于云计算&…

Python 实现txt、excel、csv文件读写【附源码】

目录 前言 一、txt文件读写 二、excel文件读写 总结 前言 本文介绍使用Python进行文件读写操作&#xff0c;包括txt文件、excel文件(xlsx、xls、csv) 编译器使用的是PyCharm 一、txt文件读写 read() # 一次性读取全部内容readline() # 读取第一…

K8s入门教程:10分钟带你速览全程

K8s&#xff0c;英文全称为Kubernetes&#xff0c;就是基于容器的集群管理平台&#xff0c;是用于自动部署、扩缩和管理容器化应用程序的开源系统。 K8s是用来干啥的&#xff1f; 简单来说&#xff0c;可以用一句话来解释&#xff1a;K8s的特点就是所有主机上都装上docker&…

Win10老是蓝屏收集错误信息重启无效怎么办?

Win10老是蓝屏收集错误信息重启无效怎么办&#xff1f;有用户遇到了电脑开机蓝屏的情况&#xff0c;收集错误信息重启电脑之后&#xff0c;依然无法解决问题。那么这个问题要怎么去进行解决呢&#xff1f;接下来我们来看看以下具体的处理方法教学吧。 准备工作&#xff1a; 1、…