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

执行步骤:

  1. 扫描非聚簇索引 idx_name:
  • 在 idx_name 索引的 B+ 树中查找 name = 'Alice' 的记录。
  • 叶子节点中存储的值是主键 id。
  1. 通过主键值回表:

使用 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 中的回表是什么?的更多相关文章

  1. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  2. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  3. 【mysql】索引 回表 覆盖索引 索引下推

    索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...

  4. MySQL中的全表扫描和索引树扫描

    引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况.在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就是type属性,ty ...

  5. MySQL中的联结表

    使用联结能够实现用一条SELECT语句检索出存储在多个表中的数据.联结是一种机制,用来在一条SELECT语句中关联表,不是物理实体,其在实际的数据库表中并不存在,DBMS会根据需要建立联结,且会在查询 ...

  6. mysql中如何删除表上的索引?删除索引?

    需求描述: 今天在做SQL的优化的时候,想要把mysql中某个表上的索引删除掉,突然忘记语法了,找到帮助,在此记录下 操作过程: 1.查看表上的索引 show index from ti_o_sms; ...

  7. 用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...

  8. mysql中delete的表别名使用方法

    在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下: <delete id="delete" param ...

  9. 你了解MySQL中的多表联合查询吗?

    前言: 多表联合查询,其实就是我们MySQL中的join语句,经常会看到有人说join非常影响性能,不建议使用,你知道这是为什么呢?我们究竟可不可以用呢? 测试数据: CREATE TABLE `t2 ...

  10. MySQL中的联表查询与子查询

    0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...

随机推荐

  1. HTTPS 证书自动化运维:告别手动管理,迎接自动化时代

    1. 引言 随着互联网的发展,网络安全变得越来越重要.HTTPS(Hypertext Transfer Protocol Secure)通过使用 SSL/TLS 协议加密数据传输,确保了用户与网站之间 ...

  2. GPU虚拟化技术简介:实现高性能图形处理的灵活部署

    本文分享自天翼云开发者社区<GPU虚拟化技术简介:实现高性能图形处理的灵活部署>,作者:z****n GPU虚拟化技术是一项重要的创新,通过将物理GPU划分为多个虚拟GPU,实现多用户共享 ...

  3. Apache Camel系列(1)----使用场景

    Apache Camel是一个基于Enterprise Integration Pattern(企业整合模式,简称EIP)的开源框架.EIP定义了一些不同应用系统之间的消息传输模型,包括常见的Poin ...

  4. .NET周刊【1月第2期 2025-01-12】

    国内文章 [.NET] API网关选择:YARP还是Ocelot? https://www.cnblogs.com/madtom/p/18655530 本文详细比较了YARP和Ocelot两种API网 ...

  5. linux安装Phoenix

    1.下载对应hbase的版本 http://www.apache.org/dyn/closer.lua/phoenix/ 解压后找到phoenix-4.14.2-HBase-1.4-server.ja ...

  6. Spring Boot项目设置跨域

    一.跨域设置 新建一个配置类 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterC ...

  7. C# 钩子函数使用

    1. 什么是钩子 hook(钩子)是windows提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过 ...

  8. Postman 调试 SignalR 发布的wss接口

    微软官网的SignalR例子拿来跑即可 Postman 调试SignalR 发送post请求获取token 将获取到的connectionToken加入ws链接 点击 Connect 发送第一条协商消 ...

  9. Emacs 的优点及与 DE 的比较

    一.引言 在编程领域,对于工具的选择一直是开发者们热议的话题.今天,我们来探讨一下 Emacs 及其所具有的优点,并思考使用 Emacs 写程序是否真的比使用集成开发环境(IDE)更方便. 二.Ema ...

  10. Hbase - hbase hbck介绍

    原文地址:https://bbs.huaweicloud.com/blogs/353332 HBaseFsck(hbck)是一种命令行工具,可检查hbase集群的region一致性和表完整性的问题,同 ...