MySQL 中什么是回表?

MySQL 回表(覆盖索引之外的查询逻辑)完整讲解

一、什么是回表

前置基础:InnoDB 索引结构

InnoDB 主键索引叫聚簇索引 :

叶子节点 = 完整一行数据(主键+所有字段)。

普通索引(二级索引):

叶子节点 = 「索引列值 + 主键ID」,不存完整行数据。

回表定义

当SQL使用普通二级索引 查询,但SELECT/WHERE需要的字段不在二级索引里时:

  1. 先通过二级索引找到满足条件的主键ID;
  2. 拿着主键ID再去主键聚簇索引 中查询完整行数据;
    这个第二次查表拿全字段 的过程,就叫回表。

举个例子

表 t_fund,主键 id,普通索引 idx_product_code(product_code)

sql 复制代码
-- 会回表
SELECT product_name, net_value FROM t_fund WHERE product_code = '001';

执行流程:

  1. 在 idx_product_code 找到 product_code='001',拿到主键 id=1001;
  2. 根据 id=1001 去主键索引读取 product_name、net_value;
    第二步操作就是回表。

无回表(覆盖索引)

如果索引包含查询全部字段,不需要二次查表,叫索引覆盖,不会回表:

sql 复制代码
CREATE INDEX idx_product ON t_fund(product_code,product_name,net_value);
SELECT product_name, net_value FROM t_fund WHERE product_code = '001';

只走二级索引,一次查询完成,无回表。

二、为什么会产生回表(不是"要用",是查询逻辑必然产生)

很多人误区:不是主动要用回表,是缺少覆盖索引时自动发生,产生的原因:

  1. 查询字段超出二级索引存储范围
    二级索引只存索引列+主键,查其他业务字段必须回主键索引拿数据;
  2. 仅创建单列普通索引,未做联合覆盖索引
    金融业务经常查多字段,单列索引必然触发回表;
  3. 使用 SELECT * 查询所有字段
    无论什么二级索引,* 一定会触发回表。

三、回表带来的问题(业务开发重点关注)

  1. 性能损耗,翻倍IO
    两次索引树查找,IO次数翻倍;大数据量、日终估值批量查询会明显变慢;
  2. 大分页、批量统计场景效率暴跌
    比如估值报表批量查询持仓数据,大量回表会拉长跑批时间;
  3. 高并发接口出现慢SQL,引发锁、超时、连接池耗尽。

四、开发中怎么规避/优化回表(金融资管平台实用方案)

  1. 杜绝 select *,只查询需要的字段;
  2. 创建联合覆盖索引,把查询条件、返回字段全部放进索引;
  3. 统计类、报表类SQL优先设计覆盖索引,消除回表;
  4. 复杂汇总查询可使用临时表、物化视图提前聚合,减少实时回表查询。

五、结合你的金融资产管理平台场景举例

场景:根据产品代码查询基金净值、产品名称、持仓规模(估值报表常用)

  • 只建单列索引 product_code:每次查询都回表,亿级资产数据跑批卡顿;
  • 建立覆盖索引 idx_pdt_code(product_code,product_name,net_value,scale):直接消除回表,批量估值、报表查询速度大幅提升。

六、补充区分

  1. 主键索引查询:永远不会回表,直接拿到完整行;
  2. 二级索引+字段不全:必然回表;
  3. 二级索引包含全部查询字段:覆盖索引,无回表。
相关推荐
小小龙学IT4 分钟前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
DongQiShanRen27 分钟前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
ShineWinsu31 分钟前
对于Redis:AOF持久化的解析
linux·数据库·redis·缓存·面试·持久化·aof
晚风叙码36 分钟前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
仍然.40 分钟前
Redis---集群
数据库·redis·缓存
Allstar_4342 分钟前
DV/PV 验证管理:为量产放行提供完整证据链——全星研发项目管理 APQP 软件系统汽车电子行业专业级研发项目管理平台
数据库·汽车
小范的技术工坊1 小时前
向量数据库解决了什么问题?
数据库
小蒜学长1 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
做运维的阿瑞2 小时前
SQL 面试高频:用户、商品、订单三表查询全解析
数据库·sql·mysql
CJi0NG3 小时前
【自用】MySQL - 语法:DDL、DML、DQL、DCL
数据库·mysql