3-001:MySQL 中的回表是什么?

news2025/3/13 19:37:55

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';

查询执行过程:

  1. 先查 idx_name 索引,找到 name='Alice' 对应的 id(假设 id = 3)。
  2. 再回表查询,根据 id=3 在聚簇索引(主键索引)中找到 address 字段。

为什么要回表? 因为 idx_name 只存了 nameid,但 address 不在索引中,必须再回到主键索引查找完整数据。


3. 什么情况下会发生回表?

  • 查询的字段不在索引覆盖范围内(即非覆盖索引查询)。
  • 使用二级索引(非主键索引)查询,而查询的字段不在索引列中。

4. 如何避免回表?

(1)使用覆盖索引

如果查询的字段已经包含在索引中,就可以避免回表

CREATE INDEX idx_name_age ON users(name, address);

然后执行:

SELECT address FROM users WHERE name = 'Alice';

此时,idx_name_age 索引已经包含 nameaddress,所以可以直接在索引中获取数据,不需要回表

(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 避免回表的方法

  1. 尽量使用覆盖索引(让查询的所有字段都包含在索引中)。
  2. 使用主键查询,避免使用非主键索引查询非索引字段。
  3. 分析 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)   -- 二级索引
);

其中,表中的数据如下:

idnameage
1Alice25
2Bob30
3Charlie35

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;

  1. 从非叶子节点找到 30 对应的叶子节点。
  2. 叶子节点存储 (age=30, id=2),返回 id=2。
  3. 回表:用 id=2 查询 users 表的主键索引,获取完整数据。

6.5 🔥 关键点总结
  1. 非叶子节点 只存索引 key(age),不存储数据
  2. 叶子节点age主键 ID,用于返回 ID 进行回表查询。
  3. 回表查询 是因为 二级索引不存完整数据,需要用主键 ID 进一步查询。
  4. 优化方式:
    • 覆盖索引(例如 INDEX idx_age_name (age, name)),让查询字段直接存入索引,避免回表。
    • 合理设计主键,避免主键过大影响二级索引的存储效率。

这样,你对二级索引的 存储结构和查询流程 是否更加清晰了呢? 😊🚀

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

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

相关文章

【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#

今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试&#xff0c;虚拟机都是一个非常实用的工具&#xff0c;它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版&#xff0c;深受广…

AutoGen学习笔记系列(十三)Advanced - Logging

这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Logging 篇章&#xff0c;介绍了怎样在使用过程中添加日志信息&#xff0c;其实就是使用了python自带的日志库 logging。 官网链接&#xff1a;https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-g…

scrcpy pc机远程 无线 控制android app 查看调试log

背景&#xff1a; 公司的安卓机&#xff0c;是那种大屏幕的连接usb外设的。不好挪动&#xff0c;占地方&#xff0c;不能直接连接pc机上的android stduio来调试。 所以从网上找了一个python adb.exe控制器&#xff0c;可以局域网内远程控制开发的app,并在android stduio上看…

UE5.5 Niagara发射器更新属性

发射器属性 在 Niagara 里&#xff0c;Emitter 负责控制粒子生成的规则和行为。不同的 Emitter 属性决定了如何发射粒子、粒子如何模拟、计算方式等。 发射器 本地空间&#xff08;Local Space&#xff09; 控制粒子是否跟随发射器&#xff08;Emitter&#xff09;移动。 ✅…

MongoDB备份与还原

备份恢复工具介绍 1&#xff09;mongoexport/mongoimport 2&#xff09;mongodump/mongorestore 备份工具区别 mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式 mongodump/mongorestore 导入/导出的是BSON格式。二进制方式&#xff0c;速度快 1&#xff09;…

计算机:基于深度学习的Web应用安全漏洞检测与扫描

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 网络爬虫 1.2 漏洞检测 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,…

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候&#xff0c;一顿操作猛如虎&#xff0c;打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况&#xff0c;要去操作两边&#xff08;宝塔and服务器所属平台…

【数据结构】List介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。此时extends意为拓展 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&…

vs2022用git插件重置--删除更改(--hard)后恢复删除的内容

1、先到项目工程中打开需要恢复的分支。 2、进入代码管理根目录文件夹。 3、在根目录文件夹点右键&#xff0c;点git bash here 正常情况下如果git目录权限足够&#xff0c;是可以如上图所示显示当前分支和当前目录的。 在git权限不足的情况下会出现如下提示&#xff1a; …

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

【MySQL】用户管理和权限

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】用户管理和权限 发布时间&#xff1a;2025.3.12 隶属专栏&#xff1a;MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…

指令微调 (Instruction Tuning) 与 Prompt 工程

引言 预训练语言模型 (PLMs) 在通用语言能力方面展现出强大的潜力。然而&#xff0c;如何有效地引导 PLMs 遵循人类指令&#xff0c; 并输出符合人类意图的响应&#xff0c; 成为释放 PLMs 价值的关键挑战。 指令微调 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…

UE5.5 Niagara 发射器粒子更新模块

Particle State &#xff08;粒子状态&#xff09;模块 Particle State 主要用于控制粒子的生存状态&#xff0c;包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时&#xff0c;销毁这些粒子。 Lifetime &…

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量&#xff0c;是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量&#xff0c;是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…

Django与视图

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲视图 在web应用的MVC结构中&#xff0c;视图一般包含模板和表单&#xff0c;用来给浏览器生成响应。在实际处理过程当中&#xff0c;视图会根据请求的参数从数据源当中找到数据&#xf…

RabbitMQ从入门到实战-2

文章目录 Java客户端快速入门WorkQueue(多消费)能者多劳配置 交换机fanout交换机案例 Direct交换机Topic交互机 声明队列和交互机&#xff08;IDEA中&#xff09;基于Bean声明队列和交换机基于注解声明&#xff08;推&#xff09; 消息转换器配置Json消息转换器 业务改造&#…

Mac 配置 Maven JDK

不使用 Homebrew&#xff0c;创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi &#xff5e;/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放&#xff0c;为了方便使用者更加自由的使用大模型&#xff0c;将大模型变成如同棒球棍一样每个人都能用&#xff0c;并且顺手方便的工具&#xff0c;本地私有化具有重要意义。 本次测试使用ollama完成模型下载&#xff0c;过程简单快捷。 1、进…

Ubuntu通过Ollama部署deepseek和千问

一、准备文件 本地服务器是Ubuntu20.04&#xff0c;输入命令uname -a即可查看 部署方式有多样&#xff0c;点击Ollama访问官网 可复制命令直接粘贴下载&#xff0c;但是过程比较慢&#xff0c;所以我推荐下面这种方式 从githubReleases ollama/ollama GitHub上下载ollama的…