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

查询执行过程:

  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.mzph.cn/web/72023.shtml

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

相关文章

【AIGC】计算机视觉-YOLO系列家族

YOLO系列家族 &#xff08;1&#xff09;YOLO发展史&#xff08;2&#xff09; YOLOX&#xff08;3&#xff09; YOLOv6&#xff08;4&#xff09; YOLOv7&#xff08;5&#xff09; YOLOv8&#xff08;6&#xff09; YOLOv9&#xff08;7&#xff09;YOLOv10&#xff08;8&…

基于Python懂车帝汽车数据分析平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;汽车数据分析平台当然不能排除在外。本次我所开发的懂车帝汽车数据分析平台是在实际应用和软件工程的开发原理之上&#xff0c;运用Python…

Prompt 工程

一、提示原則 import openai import os import openai from dotenv import load_dotenv, find_dotenv from openai import OpenAI def get_openai_key():_ load_dotenv(find_dotenv())return os.environ[OPENAI_API_KEY]client OpenAI(api_keyget_openai_key(), # This is …

MySQL -- 数据库基础

1、基础登录操作 mysql 指定选项 选项&#xff1a; <1> -h 指定ip地址&#xff0c;即连接的主机&#xff0c;不带时&#xff0c;默认连本机 <2> -P 指定的端口号&#xff0c;指定默认端口号&#xff08;配置文件中进行配置&#xff09; <3>-u 指定的用户 &l…

02C#基本结构篇(D3_内部类-代码块-数据类型-变量-常量-字面量-运算符-流程控制语句)

目录 一、内部类 1. 定义内部类 2. 创建内部类的实例 3. 访问外部类的私有成员 4. 内部静态类 5. 使用场景和优点 6. 注意事项 ------------------------------------------- 二、代码块 1. 控制流语句 1.1. 条件语句 1> if 语句 2> switch 语句 1.2. 循环语…

15 | 定义简洁架构 Store 层的数据类型

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

CSDN统计个人创作总字数

前言 不是很懂爬虫&#xff0c;所以就叫deepseek写了一个 用起来很简单&#xff0c;但是有一个小问题&#xff0c;就是统计的是总字符数。代码片会被统计进去&#xff0c;Markdown语法也会被统计进去。 不过我没有太多需求&#xff0c;能大概统计一下满足以下小小的好奇心和成…

React.js 基础与进阶教程

React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库&#xff0c;专为构建用户界面&#xff08;UI&#xff09;设计&#xff0c;尤其适用于单页面应用&#xff08;SPA&#xff09;。它采用组件化开发模式&#xff0c;使 UI 结构更加清晰、可维护性更…

msf(Metasploit)中Session与Channel的区别与关系解析

在 Metasploit Framework&#xff08;MSF&#xff09;中&#xff0c;Session 和 Channel 都是与目标主机的交互方式&#xff0c;但它们的作用和概念有所不同。本文将解析这两个术语的区别。 一、Session&#xff08;会话&#xff09; Session 是指通过 Metasploit 成功利用目标…

设计模式-结构型模式-装饰器模式

概述 装饰器模式 : Decorator Pattern : 是一种结构型设计模式. 作用 &#xff1a; 允许你动态地给对象添加功能或职责&#xff0c;而无需修改其原始类的代码,非常的符合 开闭原则。 实现思路 &#xff1a;通过创建一个包装对象&#xff08;即装饰器&#xff09;&#xff0c;来…

Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音

一、前言 在音视频开发中&#xff0c;音量的控制分两块&#xff0c;一个是控制播放器本身的音量&#xff0c;绝大部分场景都是需要控制这个&#xff0c;这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量&#xff0c;因为播放器本身的音量是在系统音量的基础上控…

基于深度学习的医学CT图像肺结节智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

前端小食堂 | Day14 - Vue 3 の传送门与悬念

&#x1f300; 今日秘技&#xff1a;Teleport 与 Suspense の时空魔法 1. Teleport 任意门 <template> <!-- &#x1f6aa; 将组件传送到 body 末尾 --> <Teleport to"body"> <div class"modal"> <h2>重要通知&#x…

emacs使用mongosh的方便工具发布

github项目地址: GitHub - csfreebird/emacs_mongosh: 在emacs中使用mongosh快速登录mongodb数据库 * 用途 在emacs中使用mongosh快速登录mongodb数据库&#xff0c; 操作方法: M-x mongosh, 输入数据库名称&#xff0c;然后就可以自动登录&#xff0c;前提是你已经配置好了…

Linux:Ubuntu server 24.02 上搭建 ollama + dify

一、安装Ubuntu 具体的安装过程可以参见此链接&#xff1a;链接&#xff1a;Ubuntu Server 20.04详细安装教程&#xff0c;这里主要记录一下过程中遇到的问题。 安装时subnet如何填写 在Ubuntu中subnet填写255.255.255.0是错误的&#xff0c;其格式为 xx.xx.xx.xx/yy &#…

unordered_set 的常用函数

在 C 的标准库中&#xff0c;std::unordered_set 是基于哈希表实现的哈希集合。下面介绍这种语言里哈希集合的常用函数。 C std::unordered_set 1. 元素操作 insert 功能&#xff1a;向哈希集合中插入元素。如果元素已经存在&#xff0c;则不会重复插入。示例代码&#xff1a…

starrocks批量启停脚本

#!/bin/bash # 定义 StarRocks 安装目录 STARROCKS_HOME"/path/to/starrocks" # 定义 FE 和 BE 节点列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…

python 提取视频中的音频

在Python中提取视频中的音频&#xff0c;你可以使用moviepy库&#xff0c;这是一个非常强大且易于使用的库&#xff0c;专门用于视频编辑。以下是如何使用moviepy来提取视频中的音频的步骤&#xff1a; 安装moviepy 首先&#xff0c;你需要安装moviepy。你可以通过pip安装它&a…

大语言模型打卡学习DAY1

学习目标&#xff1a; 语言模型的发展历程 大模型的技术基础 学习内容&#xff1a; 1. 语言模型的发展历程 语言模型通常是指能够建模自然语言文本生成概率的模型&#xff0c;从语言建模到任务求解&#xff0c;这是科学思维的一次重要跃升。2. 大语言模型技术基础 定义&#…

boarding_passes(登机牌)表的作用

boarding_passes&#xff08;登机牌&#xff09;表的作用 boarding_passes 这张表的主要作用是记录旅客的登机信息&#xff0c;包括&#xff1a; 票号 (ticket_no) - 关联到 tickets 表&#xff0c;表示这张票属于哪个旅客。航班 ID (flight_id) - 关联到 flights 表&#xf…