如何用 EXPLAIN 定位慢 SQL,type、rows、Extra 如何解读?
未标记
考查重点:执行计划与实际扫描。type 看访问方式、rows 看估算扫描量,Extra 查回表过滤、排序等;结合真实参数和执行统计验证瓶颈
本题目录
参考答案
核心回答
EXPLAIN 用于看优化器准备怎样执行 SQL。排查慢查询时,我会先找到具体 SQL 和参数,再结合计划判断:从哪张表开始、怎样访问、预计处理多少行、是否需要大量回表、排序或中间结果,而不是只确认“用了索引”。
以 MySQL 8.4 的传统表格格式为例,重点看:
type:表的访问方式,例如精确查找、范围访问、全索引扫描或全表扫描。possible_keys、key、key_len:候选索引、实际选择的索引,以及所用键长度;结合索引列定义判断是否符合预期。rows、filtered:预计检查的行数和表条件过滤后的保留比例,用于判断扫描量与后续连接的规模。Extra:覆盖、索引下推、额外排序、临时表等信息,用来解释访问之后还在做哪些工作。
普通计划主要给出优化器估算。需要验证真实执行情况时,可使用 EXPLAIN ANALYZE 查看实际耗时、行数和循环次数;它会执行语句,使用时需要考虑数据规模与负载。
type 怎样解读?
常见类型可以这样理解:
const:通过常量条件匹配完整主键或唯一键等,最多定位一行。eq_ref:连接时,对前面表的每个行组合,通过完整主键或唯一非空键,最多匹配当前表一行。ref:按非唯一索引或键的部分前缀等值查找,一个查找值可能对应多行。range:按一个或多个索引范围读取,范围也可能很大。index:全索引扫描。若索引覆盖且较窄,可能比扫描整行划算,但仍可能检查大量索引项。ALL:全表扫描。大表高频请求通常需要重点检查,小表或需要读取大部分行时也可能是合理选择。
这些类型能提示访问特征,不能当作整条 SQL 的固定性能排名。ref 若匹配大量行并反复回表,也可能比一次覆盖索引扫描更贵。
rows、filtered 和 key 怎样一起看?
InnoDB 的 rows 是估计值,不是本次真实扫描量。rows × filtered / 100 可帮助理解当前表过滤后向后续连接传递的预计行数,但还要结合连接顺序与算法。
例如在嵌套循环中,内侧一次只查少量记录,如果外侧产生很多行,内侧就可能被重复执行很多次。不能看到某一行 rows 小,就忽略整体循环次数。估计与实际相差很大时,还要检查数据倾斜、统计信息和谓词之间的相关性。
key 非空也不代表索引一定用于高效定位,它可能只是用于覆盖扫描;possible_keys 中没有列出的索引,也可能因为覆盖所需列而被扫描。key_len 需结合类型、字符集、可空性和具体范围分析,不能只数长度就断言所有条件都充分用于定位。
Extra 常见值说明什么?
Using index:所需列可由索引提供,具备覆盖访问的条件;仍要看扫描量。Using index condition:使用索引条件下推,先检查索引项,再决定是否读取行;它不等于完全不用回表。Using where:仍有条件判断,不能据此断定没有使用索引。Using filesort:需要额外排序,名字不代表一定写磁盘。Using temporary:需要临时表保存中间结果,不代表必然使用磁盘,也不自动等于瓶颈。
排序或临时表是否值得优化,要结合实际处理量和耗时;少量结果的排序可能很便宜。
怎样形成排查闭环?
先用慢查询记录、调用链或数据库监控确认主要成本,再根据计划提出假设,例如过滤太晚、连接放大、回表多或排序多。然后调整查询、索引或批量调用方式,在代表性数据和相近负载下比较结果正确性、执行耗时与处理量。
EXPLAIN ANALYZE 的多循环耗时按每次循环平均报告,父节点耗时也可能包含子节点,不能简单把整棵树的时间全部相加。计划仍解释不了所有端到端等待;数据库锁等待、连接池排队、网络和调用频次还需要其他观测配合。
例如批量日期查询把 SQL 写在循环里,即使每次都是较好的索引查找,重复往返的总成本仍可能很高。此时应一起评估批量查询与结果组装,而不是只把 type 调到更好看的名字。
对应教程
- 电商问数:SQL生成与执行闭环:校验节点用
EXPLAIN检查生成 SQL 能否解析;本文进一步解释返回计划怎样用于性能分析,解析成功本身不代表执行高效。
参考资料
- 国内:JavaGuide:MySQL执行计划分析:字段、访问方式和
Extra的专题说明,用于建立读计划的顺序,并区分覆盖与索引下推。 - 国内:JavaGuide:常见SQL优化手段总结:慢 SQL 定位、批量操作和同条件复测部分,用于把计划分析连接到实际修改与效果验证。
- 国内:小林coding:索引常见面试题:执行计划中扫描方式、实际索引和附加信息的讨论,用于识别索引扫描、范围访问与回表成本。
- 国外:MySQL 8.4:EXPLAIN Output Format:各列及
Extra的官方定义,用于核对估算行数、连接访问类型、覆盖索引和过滤的具体含义。 - 国外:MySQL 8.4:EXPLAIN Statement:计划格式与
EXPLAIN ANALYZE部分,用于说明优化器估算和实际执行信息的区别,以及循环耗时的读取方式。
相关面经
30 篇哔哩哔哩(B站)
测试开发实习如何判断MySQL查询没有使用到索引?应该怎么排查?
启云方
AI 应用开发工程师如何排查索引失效?执行计划重点看哪些字段?
思锐卓远
后端开发实习生具体说说怎么用explain去优化数据。
中科星图维天信
后端开发如何分析一条 SQL 的执行计划?怎么看是否命中索引?
华盛通
Java实习生explain 能得到什么信息?
展开剩余 25 篇面经
美团
AI 后端华为
AI 开发工程师会看慢sql吗?
字节跳动、米哈游、哔哩哔哩、百度、美团、智驾新程、CVTE
你们 EXPLAIN 看过吗?查询有没有走索引?
汇川技术
数字化全栈工程师**索引与回表**:如何利用 `EXPLAIN` 分析执行计划?联合索引在减少回表方面是如何发挥作用的?
百度
Explain 中各个 Type 有什么区别?
去哪儿
测试开发工程师怎么测试索引是否生效?
泰隆银行
IT 菁英 Java做过 SQL 性能优化吗?知道怎么看 SQL 执行计划吗?
阿里巴巴(淘天)
AI 应用开发工程师MySQL 查询做过哪些索引优化,explain 有没有用过
趣链科技
做过 sql 调优吗?如果拿到一条慢 sql 你如何分析?explain 命令,使用该关键字查出来的指标?你知道一般这里的 type 要优化到什么级别?
他山科技
机器人数据采集平台开发刚才说 EXPLAIN,你会看哪些字段来判断?
哔哩哔哩(B站)
Agent 开发SQL怎么看有没有走索引?
安软
AI应用开发实习生慢 SQL 应该从执行计划、索引、SQL 写法和数据分布等哪些方面排查?
CVTE
应用软件开发-- 你项目里说做过一次慢SQL优化,具体是怎么通过explain定位问题的,最后加索引还是改写SQL解决的?
字节跳动
后端开发实习生OK,那么你怎么判断你写的SQL,是否用到了索引?
字节跳动
后端开发工程师(AI)线上慢SQL如何使用explain分析,type、rows、Extra字段分别代表什么,哪些指标说明SQL需要优化?
亚信科技
Java 开发工程师MySQL数据库相关:批量日期查询for循环内嵌SQL执行缓慢,如何优化?是否了解慢查询、explain执行计划,作用是什么?
公司未注明
Java 后端开发Explain 主要看哪些字段?
熙牛医疗
Java 驻场开发用过explain分析sql吗
京东
后端开发工程师(Agent)执行计划(explain)里你会看哪些列?
公司未注明
Vibe Coding如何通过 EXPLAIN 分析慢 SQL?能解读哪些关键指标?
滴滴
后端开发explain执行计划哪种效率最高?
百度
智能体开发如何查看索引使用情况








