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 BY或GROUP 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等参数对回表无实质缓解作用,它只影响预读,不改变回表逻辑
真正容易被忽略的是:开发常以为「有索引=快」,却没检查 EXPLAIN 的 Extra 列,也没验证 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自然语言搜索引擎项目教程_倒排索引查询优化案例
公司网站制作价格怎么算,公司办个官网需要多少钱?
做企业网站制作流程,企业网站制作基本流程有哪些?


和磁盘争用