【MySQL-索引调优】04:回表相关概念

PS:现在orders表中存在idx_user_id(user_id),以及idx_user_status(user_id, status)两个索引

1-例子

假设orders表内部有10w条数据,满足user_id = 1 AND status = 1的有5w条,运行:

mysql 复制代码
SELECT user_id, status, amount FROM orders  WHERE user_id = 1 AND status = 1;

此时会用到联合索引idx_user_status(user_id, status),但是我们还查询了一个字段amount,此时,就要去回表了,就是用现在的结果,再通过id去拿amount,流程如下:

bash 复制代码
步骤1: 在二级索引 idx_user_status 中找到 50,000 个匹配项
        ↓
步骤2: 对每一条记录,拿着主键 id 去回表查 amount
        ↓
        ├─> 回表 1 次:根据 id=101 去聚簇索引查 amount
        ├─> 回表 2 次:根据 id=205 去聚簇索引查 amount
        ├─> ... 重复 50,000 次 ...
        └─> 回表 50,000 次:根据 id=xxxxx 查 amount
        
        ↓
步骤3: 返回结果

PS:针对高频查询,尽量让 WHERE 条件 + SELECT 字段 都被同一个索引覆盖,彻底消灭回表

2-回表

用现在的结果,再通过id去拿其他信息

3-回表的方式

  • MySQL的InnoDB存储引擎里,二级索引(比如你建的联合索引)存储的是索引字段 + 主键值
  • 当你需要额外字段(如amount),数据库会用索引定位到主键,然后再通过主键去表里查对应的行
  • 所以确实是每一条匹配的记录都要回表一次,在上方的例子里就是5万次回表
相关推荐
IT枫斗者枫哥5 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
Flynt5 小时前
"MySQL搜不动就上ES"?我先在50万行数据上测了它自带的ngram全文索引
mysql·elasticsearch·搜索引擎
Y005 小时前
PostgreSQL 的锁:为什么你的 ALTER TABLE 会卡住,以及怎么查
数据库·postgresql
imDwAaY5 小时前
Redo Log 和 Binlog 为什么需要两阶段提交?
后端·mysql
Flynt5 小时前
官方说一个破折号拖慢整段高亮,我在 Node 里验证了一遍:机制是真的,2.8 倍没跑出来
javascript·性能优化·v8
灰原喜欢柯南5 小时前
OceanBase 运维管理知识点——OCP 监控、诊断与变更控制
数据库·oceanbase
码农-0045 小时前
Springboot 集成 Ehcache操作数据库显示SQL语句设置
数据库·spring boot·sql
仍然.5 小时前
Redis---事务
数据库·redis
oradh5 小时前
Oracle 执行计划的阅读方法(二叉树结构来理解和阅读)
数据库·oracle·执行计划的阅读方法
SelectDB5 小时前
Doris 向量检索上线踩坑记录:七个排查现场与可直接复制的命令
大数据·数据库·数据分析