MySQL 中的回表是什么?
MySQL 中的回表
回表是 MySQL 查询优化中的一个概念,指的是在使用非聚簇索引查询时,无法直接从索引中获取所需的所有数据,需要通过非聚簇索引查找到主键值,然后再去聚簇索引中根据主键值获取完整数据行的过程。
1. 回表的触发条件
- 使用了非聚簇索引(也称二级索引、辅助索引)。
- 查询的列中有部分字段不包含在非聚簇索引的叶子节点中。
- 查询无法通过覆盖索引优化(即查询涉及的字段不全在索引中)。
2. 回表的实现过程
假设有如下表结构和查询:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100),
KEY idx_name (name)
);
查询语句:
SELECT age, email FROM users WHERE name = 'Alice';
执行步骤:
- 扫描非聚簇索引 idx_name:
- 在 idx_name 索引的 B+ 树中查找 name = 'Alice' 的记录。
- 叶子节点中存储的值是主键 id。
- 通过主键值回表:
使用 id 到聚簇索引(主键索引)对应的 B+ 树中,找到完整的数据行。
获取 age 和 email 的值。
3. 回表的性能开销
- 磁盘 I/O:回表可能导致多次随机磁盘读取(如果数据不在内存中)。
- 查询延迟:需要在聚簇索引和非聚簇索引之间来回跳转,增加查询时间。
4. 如何减少回表
(1)覆盖索引
定义:当查询的所有字段都包含在非聚簇索引中时,MySQL 可以直接从索引中获取数据,无需回表。
优化方式:
- 在索引中添加查询需要的字段(称为索引覆盖)。
示例:
CREATE INDEX idx_name_age_email ON users(name, age, email);
- 在索引中添加查询需要的字段(称为索引覆盖)。
(2)减少查询列
- 仅查询必要字段,避免不必要的列导致回表。
(3)合理设计表结构
- 通过优化索引设计,将查询的高频字段优先纳入索引。
5. 聚簇索引与非聚簇索引的关系
- 聚簇索引:
- 数据和索引存储在一起,不存在回表问题。
- 非聚簇索引:
- 数据和索引分开存储,查询完整数据行时可能需要回表。
6. 总结
| 术语 | 描述 |
|---|---|
| 回表 | 从非聚簇索引中查询到主键值后,再访问聚簇索引获取完整数据行的过程。 |
| 触发条件 | 查询涉及的字段不在非聚簇索引中,或查询字段超出索引覆盖的范围。 |
| 解决方法 | 通过覆盖索引、减少查询列或优化表结构等方式,减少回表操作,提升查询性能。 |
MySQL 中的回表是什么?的更多相关文章
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- mysql中把一个表的数据批量导入另一个表中
mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...
- 【mysql】索引 回表 覆盖索引 索引下推
索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...
- MySQL中的全表扫描和索引树扫描
引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况.在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就是type属性,ty ...
- MySQL中的联结表
使用联结能够实现用一条SELECT语句检索出存储在多个表中的数据.联结是一种机制,用来在一条SELECT语句中关联表,不是物理实体,其在实际的数据库表中并不存在,DBMS会根据需要建立联结,且会在查询 ...
- mysql中如何删除表上的索引?删除索引?
需求描述: 今天在做SQL的优化的时候,想要把mysql中某个表上的索引删除掉,突然忘记语法了,找到帮助,在此记录下 操作过程: 1.查看表上的索引 show index from ti_o_sms; ...
- 用命令从mysql中导出/导入表结构及数据
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...
- mysql中delete的表别名使用方法
在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下: <delete id="delete" param ...
- 你了解MySQL中的多表联合查询吗?
前言: 多表联合查询,其实就是我们MySQL中的join语句,经常会看到有人说join非常影响性能,不建议使用,你知道这是为什么呢?我们究竟可不可以用呢? 测试数据: CREATE TABLE `t2 ...
- MySQL中的联表查询与子查询
0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...
随机推荐
- EIP和NAT结合如何实现统一公网出口IP
本文分享自天翼云开发者社区<EIP和NAT结合如何实现统一公网出口IP>,作者:j****n 通过EIP和NAT网关结合,为已绑定EIP的ECS实例统一公网出口IP,有利于更高效的管理互联 ...
- Javascript基础,基本数据类型,function方法,arguments对象,Error对象
Javascript基础,基本数据类型,function方法,arguments对象,Error对象1.内部脚本写在body里面好 外部脚本放在head里面引用2.基本数据类型存在堆内存中 引用类型存 ...
- Numa初识
本文分享自天翼云开发者社区<Numa初识>,作者:j****n Numa产生 在二十世纪九十年代被开发出来的. 首次商业化实现基于NUMA的Unix系统的是对称多处理XPS-100系列服务 ...
- [图形绘制/流程图] Mermaid : 开源的低代码图形绘制语言、协议及工具
概述:Mermaid Mermaid是一种基于Javascript的.开源的文本驱动图表生成工具/绘图工具,,使用类似于Markdown的低代码语法,它允许用户使用简单的文本语言来创建各种类型的图表 ...
- Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
水影若深蓝:挺好的一道并查集构造题. 观察 不难发现"距离为 \(2\)"这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为 \(2\) 的点 ...
- .Net Core WebAPI部署多服务器配置Nginx负载均衡
下载Nginx包: https://nginx.org/en/download.html 首先下载Nginx包 注意:下载路径必须为英文,不能到中文: 启动Nginx: 打开刚刚下载的Nginx包,然 ...
- CF57C Array 题解
发现单调不降序列反过来就是单调不增序列,只需考虑单调不降序列即可. 假如将问题转化为:初始为 \(1\),一共有 \(n+1\) 个位置,有 \(n-1\) 次增加答案的机会,每个位置可以拥有多次增加 ...
- VSCode 如何选中包含某个字母的所有行
- Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率
title: Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 date: 2025/2/23 updated: 2025/2/23 author: cmdragon exce ...
- QT5笔记: 8. QT的全局变量(基本数据类型、函数、宏)
这个头文件中存放着QT类库的一些全局定义,一般Qt类的头文件会包含这个头文件: 基本数据类型 函数 宏 数据类型:保证跨平台时各数据类型长度统一 函数定义(一些数学函数未在QtGlobal中,而是在Q ...