3-001:MySQL 中的回表是什么?
1. 什么是回表?
回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 需要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据,这一过程称为回表。
2. 回表的示例
假设有一张 users 表:
CREATE TABLE users (id INT PRIMARY KEY, -- 主键name VARCHAR(50), -- 用户名age INT, -- 年龄address VARCHAR(255), -- 地址INDEX idx_name (name) -- 创建 name 的辅助索引
) ENGINE=InnoDB;
如果执行以下查询:
SELECT address FROM users WHERE name = 'Alice';
查询执行过程:
- 先查 idx_name 索引,找到
name='Alice'对应的id(假设 id = 3)。 - 再回表查询,根据
id=3在聚簇索引(主键索引)中找到address字段。
为什么要回表? 因为
idx_name只存了name和id,但address不在索引中,必须再回到主键索引查找完整数据。
3. 什么情况下会发生回表?
- 查询的字段不在索引覆盖范围内(即非覆盖索引查询)。
- 使用二级索引(非主键索引)查询,而查询的字段不在索引列中。
4. 如何避免回表?
(1)使用覆盖索引
如果查询的字段已经包含在索引中,就可以避免回表:
CREATE INDEX idx_name_age ON users(name, address);
然后执行:
SELECT address FROM users WHERE name = 'Alice';
此时,idx_name_age 索引已经包含 name 和 address,所以可以直接在索引中获取数据,不需要回表。
(2)使用主键查询
如果使用 id(主键)查询,就不需要回表:
SELECT address FROM users WHERE id = 3;
因为 InnoDB 的主键索引(聚簇索引)本身就存储了完整数据,所以查询 id 不会回表。
5. 总结
| 查询方式 | 是否回表 | 原因 |
|---|---|---|
| 主键查询 (SELECT * FROM users WHERE id = 3) | ❌ 不会 | 因为主键索引(聚簇索引)包含完整数据 |
| 非主键索引查询 (SELECT address FROM users WHERE name = ‘Alice’) | ✅ 会回表 | 先查 name 索引,再回表查 address |
| 覆盖索引查询 (SELECT name FROM users WHERE name = ‘Alice’) | ❌ 不会 | name 索引已经包含查询字段 |
🚀 结论: MySQL InnoDB 避免回表的方法:
- 尽量使用覆盖索引(让查询的所有字段都包含在索引中)。
- 使用主键查询,避免使用非主键索引查询非索引字段。
- 分析 EXPLAIN 结果,关注
Extra字段是否包含"Using index"(表示使用了覆盖索引)。
这样可以减少回表,提高查询性能!🚀
6. 拓展:二级索引的叶子节点和非叶子节点存储内容**
6.1 二级索引 B+ 树结构示意
假设有如下 users 表:
CREATE TABLE users (id INT PRIMARY KEY, -- 聚簇索引name VARCHAR(50),age INT,INDEX idx_age (age) -- 二级索引
);
其中,表中的数据如下:
| id | name | age |
|---|---|---|
| 1 | Alice | 25 |
| 2 | Bob | 30 |
| 3 | Charlie | 35 |
6.2 完整的二级索引 B+ 树结构
(30)/ \(25) (35)/ \ / \(age=25,id=1) (age=30,id=2) (age=35,id=3)
6.3 📌 结构解析
- 非叶子节点(索引键):
- 只存储 索引列 age,用于 快速查找数据所在的叶子节点。
- 例如,
30代表左侧存<30的数据,右侧存>=30的数据。
- 叶子节点(存储实际索引数据):
- 存储 索引列 age 和 主键 id,但 不存储完整数据。
- 例如,叶子节点
(age=30, id=2)说明age=30的数据,主键id=2。 - 叶子节点 通过主键 id 回表查询完整数据。
6.4 二级索引查询流程
查询 SELECT * FROM users WHERE age = 30;
- 从非叶子节点找到 30 对应的叶子节点。
- 叶子节点存储 (age=30, id=2),返回 id=2。
- 回表:用
id=2查询users表的主键索引,获取完整数据。
6.5 🔥 关键点总结
- 非叶子节点 只存索引 key(
age),不存储数据。 - 叶子节点 存
age和 主键 ID,用于返回 ID 进行回表查询。 - 回表查询 是因为 二级索引不存完整数据,需要用主键 ID 进一步查询。
- 优化方式:
- 覆盖索引(例如
INDEX idx_age_name (age, name)),让查询字段直接存入索引,避免回表。 - 合理设计主键,避免主键过大影响二级索引的存储效率。
- 覆盖索引(例如
这样,你对二级索引的 存储结构和查询流程 是否更加清晰了呢? 😊🚀
相关文章:
3-001:MySQL 中的回表是什么?
1. 什么是回表? 回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 需要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据…...
单片机设计暖脚器研究
标题:单片机设计暖脚器研究 内容:1.摘要 本文聚焦于基于单片机设计暖脚器的研究。背景方面,在寒冷季节,暖脚器能有效改善脚部寒冷状况,提升人们的舒适度,但传统暖脚器存在功能单一、温控不准确等问题。目的是设计一款智能、高效且…...
【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#
今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试,虚拟机都是一个非常实用的工具,它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版,深受广…...
AutoGen学习笔记系列(十三)Advanced - Logging
这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Logging 篇章,介绍了怎样在使用过程中添加日志信息,其实就是使用了python自带的日志库 logging。 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-g…...
scrcpy pc机远程 无线 控制android app 查看调试log
背景: 公司的安卓机,是那种大屏幕的连接usb外设的。不好挪动,占地方,不能直接连接pc机上的android stduio来调试。 所以从网上找了一个python adb.exe控制器,可以局域网内远程控制开发的app,并在android stduio上看…...
UE5.5 Niagara发射器更新属性
发射器属性 在 Niagara 里,Emitter 负责控制粒子生成的规则和行为。不同的 Emitter 属性决定了如何发射粒子、粒子如何模拟、计算方式等。 发射器 本地空间(Local Space) 控制粒子是否跟随发射器(Emitter)移动。 ✅…...
深度剖析Redis:双写一致性问题及解决方案全景解析
在高并发场景下,缓存与数据库的双写一致性是每个开发者必须直面的核心挑战。本文通过5大解决方案,带你彻底攻克这一技术难关! 一、问题全景图:当缓存遇到数据库 1.1 典型问题场景 // 典型问题代码示例 public void updateProduc…...
MongoDB备份与还原
备份恢复工具介绍 1)mongoexport/mongoimport 2)mongodump/mongorestore 备份工具区别 mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式 mongodump/mongorestore 导入/导出的是BSON格式。二进制方式,速度快 1)…...
计算机:基于深度学习的Web应用安全漏洞检测与扫描
目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 网络爬虫 1.2 漏洞检测 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,…...
postgresql14编译安装脚本
#!/bin/bash####################################readme################################### #先上传postgresql源码包,再配置yum源,然后执行脚本 #备份官方yum源配置文件: #cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS…...
Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
部署项目至服务器:响应时间太长,无法访问此页面?
在我们部署项目到服务器上的时候,一顿操作猛如虎,打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况,要去操作两边(宝塔and服务器所属平台…...
如何搭建一个适配微信小程序,h5,app的uni-app项目
在vscode搭建 uni-app 项目(Vue 3 Vite Pinia uView Plus) 一、环境准备 1. 安装 Node.js 确保已安装 Node.js(需≥14版本),可通过以下命令检查版本: node -v2. 安装 VSCode 从 VSCode 官网 下载并…...
【数据结构】List介绍
目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中,List是一个接口,继承自Collection。此时extends意为拓展 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示&…...
vs2022用git插件重置--删除更改(--hard)后恢复删除的内容
1、先到项目工程中打开需要恢复的分支。 2、进入代码管理根目录文件夹。 3、在根目录文件夹点右键,点git bash here 正常情况下如果git目录权限足够,是可以如上图所示显示当前分支和当前目录的。 在git权限不足的情况下会出现如下提示: …...
【C++】【数据结构】链表与线性表
线性表和链表优缺点及适用场景 线性表(以数组为例) 优点:随机访问效率高,可通过下标直接访问元素,时间复杂度为 O (1);存储密度大,内存连续存储,空间利用率高。缺点:插入…...
vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题
1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆,邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible ; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…...
【MySQL】用户管理和权限
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】用户管理和权限 发布时间:2025.3.12 隶属专栏:MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…...
3ds Max 快捷键分类指南(按功能划分)
以下整理了 3ds Max 常用快捷键,按核心功能模块分类,适用于 建模、动画、渲染 等全流程操作。 一、视图操作 快捷键功能Alt W最大化当前视图G隐藏/显示栅格F3线框/实体显示切换F4显示边面(实体线框)Z聚焦选中对象到视图中心Ctrl…...
npm、pnpm、cnpm、yarn、npx之间的区别
文章目录 区别特点pnpmyarncnpm 关键解读如何选择代码示例安装依赖运行命令 区别 特性npmyarnpnpmcnpmnpx核心定位Node.js 默认包管理增强稳定性与性能高效存储与严格隔离国内镜像加速工具临时执行包命令依赖存储方式扁平化 node_modules扁平化 lock 文件全局硬链接 符号链接…...
指令微调 (Instruction Tuning) 与 Prompt 工程
引言 预训练语言模型 (PLMs) 在通用语言能力方面展现出强大的潜力。然而,如何有效地引导 PLMs 遵循人类指令, 并输出符合人类意图的响应, 成为释放 PLMs 价值的关键挑战。 指令微调 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…...
Linux学习(十五)(故障排除(ICMP,Ping,Traceroute,网络统计,数据包分析))
故障排除是任何 Linux 用户或管理员的基本技能。这涉及识别和解决 Linux 系统中的问题。这些问题的范围包括常见的系统错误、硬件或软件问题、网络连接问题以及系统资源的管理。Linux 中的故障排除过程通常涉及使用命令行工具、检查系统和应用程序日志文件、了解系统进程&#…...
【大模型】硅基流动对接DeepSeek使用详解
目录 一、前言 二、硅基流动介绍 2.1 硅基流动平台介绍 2.1.1 平台是做什么的 2.2 主要特点与功能 2.2.1 适用场景 三、硅基流动快速使用 3.1 账户注册 3.2 token获取 3.2.1 获取token技巧 四、Cherry-Studio对接DeepSeek 4.1 获取 Cherry-Studio 4.2 Cherry-Stud…...
UE5.5 Niagara 发射器粒子更新模块
Particle State (粒子状态)模块 Particle State 主要用于控制粒子的生存状态,包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时,销毁这些粒子。 Lifetime &…...
机器学习(吴恩达)
一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量,是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量,是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…...
JavaWeb-servlet6中request和response的使用
HttpServletRequest HttpServletRequest 继承自 ServletRequest。客户端浏览器发出的请求被封装成为一个 HttpServletRequest对象。 对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统…...
Django与视图
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲视图 在web应用的MVC结构中,视图一般包含模板和表单,用来给浏览器生成响应。在实际处理过程当中,视图会根据请求的参数从数据源当中找到数据…...
RabbitMQ从入门到实战-2
文章目录 Java客户端快速入门WorkQueue(多消费)能者多劳配置 交换机fanout交换机案例 Direct交换机Topic交互机 声明队列和交互机(IDEA中)基于Bean声明队列和交换机基于注解声明(推) 消息转换器配置Json消息转换器 业务改造&#…...
【每日八股】计算机网络篇(四):HTTP
目录 HTTP 与 HTTPS 的区别?HTTPS 加密与认证的过程?ClientHelloServerHello客户端回应服务端回应 HTTPS 一定安全可靠吗?HTTPS 状态码的含义?HTTP 缓存有哪些实现方式?HTTP 1.0、HTTP 1.1、HTTP 2.0 和 HTTP 3.0 的区…...
Mac 配置 Maven JDK
不使用 Homebrew,创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi ~/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…...
