mysql执行SQL过程中会发生回表吗_索引执行流程说明

发布时间 - 2026-01-04 00:00:00    点击率:
MySQL在InnoDB中使用二级索引查询时,若SELECT字段未被索引完全覆盖,需回表到聚簇索引获取完整行数据;典型场景包括SELECT含非索引列、ORDER BY/GROUP BY涉及非索引列等,可通过EXPLAIN的Extra字段判断,如无“Using index”即可能回表。

MySQL 什么时候会回表?

会,只要 SELECT 的字段不在当前使用的索引中全部覆盖,且引擎是 InnoDB,就大概率发生回表。回表不是语法行为,而是 InnoDB 在二级索引(非聚簇索引)查到主键后,再拿着主键去聚簇索引(即主键索引)里捞完整行数据的过程。

典型触发场景:WHERE 条件走了二级索引,但 SELECT 里包含了该索引没包含的列(比如 SELECT name, email FROM users WHERE city = 'Beijing',而 city 是单独的二级索引)。

  • 只有 SELECT * 或含非索引列时才可能回表;如果 SELECT 的全是索引列(包括联合索引中的部分或全部),就走“索引覆盖”,不回表
  • ORDER BYGROUP BY 涉及非索引列,也可能迫使回表(即使 WHERE 匹配了索引)
  • 使用 LIKE 'xxx%' 走了索引,但选了非索引列 → 同样回表

如何判断一条 SQL 是否回表?

EXPLAIN 输出里的 Extra 字段:

  • 出现 Using index:说明走了索引覆盖,没回表
  • 出现 Using where; Using index:也属于索引覆盖(WHERE 在索引上完成,无需回表取数据)
  • 只出现 Using where(没带 Using index):大概率回表了
  • 出现 Using index condition:用了 ICP(索引下推),仍可能回表——ICP 只是把部分 WHERE 过滤下推到存储引擎层,不代表不取整行
EXPLAIN SELECT id, name FROM users WHERE city = 'Shanghai';

city 是普通索引,而 name 不在该索引中,则 Extra 里不会出现 Using index,实际执行时就会回表。

联合索引怎么影响回表?

联合索引的顺序和 SELECT 列是否被“覆盖”,直接决定回表与否。例如建立索引 INDEX idx_city_name_age (city, name, age)

  • SELECT city, name FROM ... WHERE city = 'X'Using index,不回表
  • SELECT city, name, age FROM ... WHERE city = 'X' → 仍不回表(全在索引里)
  • SELECT city, name, email FROM ... WHERE city = 'X' → 回表(email 不在索引中)
  • SELECT name FROM ... WHERE age = 25 → 无法用该联合索引(最左前缀不匹配),可能走全表或其它索引,与回表无关

注意:ORDER BY city, name 可利用该索引避免文件排序;但 ORDER BY name 单独出现,无法利用,可能触发回表+临时表+filesort。

回表对性能的影响有多大?

一次回表 ≈ 一次随机主键查找(B+ 树搜索),在 SSD 上约 0.1–0.3ms,在 HDD 上可能达几毫秒。当扫描 10 万行二级索引记录,就要额外做 10 万次主键查找 —— IO 放大严重,极易成为瓶颈。

  • 回表不可缓存:每次都要访问聚簇索引页,Buffer Pool 命中率低
  • 并发高时,大量回表加剧 Buffer Pool 和磁盘争用
  • 优化方向优先是“让查询走覆盖索引”,而不是盲目加索引;加宽联合索引前需评估写入开销和维护成本
  • innodb_read_ahead_threshold 等参数对回表无实质缓解作用,它只影响预读,不改变回表逻辑

真正容易被忽略的是:开发常以为「有索引=快」,却没检查 EXPLAINExtra 列,也没验证 SELECT 列是否被索引完全覆盖——回表往往静默发生,直到慢查询日志爆发才被发现。


# mysql  # ai  # sql  # select  # using  # 并发  # 主键  # 走了  # 不回  # 的是  # 行数  # 都要  # 也没  # 什么时候  # 不代表  # 拿着 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python3.6正式版新特性预览  深圳网站制作的公司有哪些,dido官方网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何在阿里云虚拟服务器快速搭建网站?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何注册花生壳免费域名并搭建个人网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何确认建站备案号应放置的具体位置?  如何解决hover在ie6中的兼容性问题  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  *服务器网站为何频现安全漏洞?  如何在Windows服务器上快速搭建网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何快速辨别茅台真假?关键步骤解析  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  手机网站制作与建设方案,手机网站如何建设?  打造顶配客厅影院,这份100寸电视推荐名单请查收  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  网站建设整体流程解析,建站其实很容易!  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何快速生成橙子建站落地页链接?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  java中使用zxing批量生成二维码立牌  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何彻底删除建站之星生成的Banner?  JS碰撞运动实现方法详解  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  详解jQuery停止动画——stop()方法的使用  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何升级到最新版本?(升级指南和步骤)  微信公众帐号开发教程之图文消息全攻略  微信小程序 require机制详解及实例代码  Python自动化办公教程_ExcelWordPDF批量处理案例  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  焦点电影公司作品,电影焦点结局是什么?  高端网站建设与定制开发一站式解决方案 中企动力  高防服务器:AI智能防御DDoS攻击与数据安全保障  WordPress 子目录安装中正确处理脚本路径的完整指南  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  公司网站制作价格怎么算,公司办个官网需要多少钱?  做企业网站制作流程,企业网站制作基本流程有哪些?