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. C# Dev GridView当前行

    DEV获取GridControl当前行 //直接通过gridView获取当前行 dr=this.gridView1.GetDataRow(this.gridView1.FocusedRowHandle ...

  2. Centos 7 单用户模式修改密码/配置

    1.启动系统,启动项界面显示时,按"↑↓"键停留在此界面,按下"e"键进入编辑模式 2.利用"↑↓"键找到"linux16&quo ...

  3. 服务器主机:复杂理论的视角与SEO策略

    本文分享自天翼云开发者社区<服务器主机:复杂理论的视角与SEO策略>,作者:不知不觉 在数字世界的演变中,服务器主机在信息存储和数据处理方面发挥着核心作用.本文将带你重新认识服务器主机的价 ...

  4. 创建json文件上传下载ftp

    package org.jeecg.modules.util; import java.io.File; import java.io.FileOutputStream; import java.io ...

  5. C# 程序流控制 条件语句

    C#语言最基本的重要语句:控制程序流的语句.它们不是按代码在程序中的排列位置顺序执行的. 条件语句 条件语句可以根据条件是否满足或根据表达式的值来控制代码的执行分支.C#有两个控制代码的分支结构: i ...

  6. RFID基础——ISO15693标签存储结构及访问控制命令说明

    ISO15693协议标准的高频RFID无源IC卡,具有高度防冲突与长距离运作等优点,主要应用与资产管理.图书馆管理.供应链管理.医疗领域.开发基于 ISO15693 的应用首先需要了解标签的存储结构以 ...

  7. IPMITool 工具使用详细教程

    IPMITool 工具使用详细教程 一.IPMI 与 IPMITool 简介 1. IPMI 概述 智能平台管理接口(Intelligent Platform Management Interface ...

  8. Arduino部分C语言含义之--“::”

    "::"在C++中表示作用域,和所属关系."::"是运算符中等级最高的.有三种作用. 1.作用域符号例如:A,B表示两个类,在A,B中都有成员member.那么 ...

  9. Android高版本Service在后台一分钟被杀死

    最近公司出现了一个Bug,Service在后台写log时候一分钟左右被杀死,或者运行一会就被杀死了,上网搜了一下原来是Android高版本为了保护电量,流量什么的,会在后台杀死这些Service,现在 ...

  10. wikidata介绍和查询

      Wikidata是一个大型结构化开源知识图,为维基百科等项目提供支持.我们可使用SPARQL(Wikidata官方Tutorial)对其进行查询.SPARQL是一种专为 RDF(Resource ...