什么是回表查询

"回表查询"是 数据库索引使用中的一个概念 ,尤其常见于 MySQL InnoDB 存储引擎。


1️⃣ 回表查询的定义

回表查询(Index Lookup + Table Access / Bookmark Lookup)

指查询时使用了 非覆盖索引(non-covering index),索引本身没有包含查询需要的全部列,需要通过索引找到主键或行指针,然后再回到聚簇索引(或者数据表)去读取完整行数据的过程。

简单来说:

  1. 先在索引中找到匹配的键值和对应的行指针(主键)。
  2. 再根据主键去 表(叶子节点) 找完整的行数据。

2️⃣ 举例说明

假设有一张表 user:

sql 复制代码
CREATE TABLE user (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    age INT,
    INDEX idx_name(name)
);
  • idx_name 索引只包含 name 和 id(因为是二级索引,InnoDB 二级索引里存的是索引列 + 主键)。
  • 查询:
sql 复制代码
SELECT age FROM user WHERE name = 'Alice';
  • 索引 idx_name 里有 name='Alice' 对应的 id=101。

  • 但是我们要查询的列是 age,索引里没有。

  • 回表步骤:

    1. 在 idx_name 索引中找到 name='Alice' 的 id=101。
    2. 再用 id=101 去聚簇索引(表)中找到 age 列的值。
  • 这个额外的访问表的过程,就是 回表查询。


3️⃣ 回表查询的特点

  • 触发条件:非覆盖索引、查询列不在索引中。

  • 开销:会多一次访问表(磁盘 I/O 或 Buffer Pool)。

  • 优化方式:

    1. 覆盖索引:在索引里包含查询的所有列。

      sql 复制代码
      CREATE INDEX idx_name_age ON user(name, age);

      这样查询 SELECT age FROM user WHERE name='Alice'; 就不需要回表。

    2. 尽量使用主键查询,避免二级索引回表。

    3. 查询时只选索引列,减少回表。


💡 总结一句话:

回表查询就是:先用二级索引找到主键,再用主键去表里获取完整行数据的过程。


相关推荐
为思念酝酿的痛12 分钟前
MySQL表的约束
数据库·mysql
时间售卖铺18 分钟前
MySQL存储过程流程控制全解析
运维·数据库·mysql·云原生
IT19959 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
paopaokaka_luck12 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
lzhdim13 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
这个DBA有点耶15 小时前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
程序员塔塔喵16 小时前
【MySQL篇|第三篇】脏读,幻读,不可重复读
数据库·mysql·不可重复读·幻读·脏读
这个DBA有点耶17 小时前
备份成功≠数据可恢复:静默损坏会让物理备份把坏页一起带走
数据库·mysql·代码规范
数据库小学妹17 小时前
MySQL MDL锁等待排查:DDL卡住与长事务定位
数据库·后端·mysql
lhdz_bj18 小时前
Mysql Server配置详解
mysql·配置·file·config·1024程序员节·option·选项