跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

怎样在MySQL中查看某个SQL语句的性能瓶颈_使用EXPLAIN分析执行计划

直接看EXPLAIN的type、key、rows、Extra四列即可定位多数性能瓶颈:type=ALL或index需警惕索引缺失,key为空表示索引失效,rows远大于结果行数说明扫描低效,Extra含Using filesort/temporary必须优化。 直接看
EXPLAIN
输出里的
type
、
key
、
rows
和
Extra
这四列,就能快速定位绝大多数 性能瓶颈 。其他字段(如
id
、
select_type
)主要用于理解执行逻辑,不直接影响性能判断。 type 值低于 range 就要警惕
type
是访问类型,反映是否用索引、怎么用索引。它从优到劣依次是:
system
>
const
>
eq_ref
>
ref
>
range
>
index
>
ALL
。 常见问题场景:
type = ALL
:全表扫描, 最常见性能杀手 ,尤其在大表上;优先检查
WHERE
条件字段有没有索引,或索引是否被函数/隐式转换破坏
type = index
:索引全扫描,比
ALL
稍好但仍是低效操作;说明走了索引,但没用上索引的查找能力(比如
ORDER BY
无索引、
SELECT *
导致回表开销大)
type = range
是底线,表示用了索引范围扫描;再往上(
ref
及以上)才算“合理使用索引” key 为空或与预期不符说明索引失效
key
显示 MySQL 实际选择的索引。如果它是
NULL
,或者和你预设的索引不一致,基本可以断定索引没被用上。 典型原因包括: MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载
WHERE
中对索引字段用了函数,如
WHERE YEAR(create_time) = 2024
→ 改成
WHERE create_time BETWEEN '2024-01-01' AND '2024-12-31'
存在隐式类型转换,如
WHERE user_id = '123'
(
user_id
是
INT
),MySQL 会放弃索引 联合索引未满足最左前缀,如索引是
(a, b, c)
,但查询只用了
WHERE b = 1
或
WHERE c = 1
possible_keys
有值但
key
是
NULL
:优化器评估后认为走索引反而更慢(比如查了 80% 行),这时得结合
rows
和实际数据分布判断 rows 值远大于实际结果集行数就是隐患
rows
是优化器估算的扫描行数,不是精确值,但极具参考价值。它和真实性能强相关: 如果
rows = 100000
但最终只返回 10 行,大概率存在“查得多、用得少”的问题,比如缺失索引、条件写法导致无法下推
rows
偏高时,先看
type
是否为
ALL
或
index
;再确认
key
是否生效;最后检查统计信息是否过期(可运行
ANALYZE TABLE table_name
更新) 注意:当
rows
很小(比如 1 或 2)但查询仍慢,问题可能不在扫描本身,而在锁等待、磁盘 I/O 或网络传输 Extra 出现 Using filesort 或 Using temporary 必须处理
Extra
是执行过程中的附加行为,两个关键词是硬性红线:
Using filesort
:MySQL 无法利用索引完成排序,需额外排序操作;常见于
ORDER BY
字段没索引,或索引顺序与排序要求不匹配(如索引
(a, b)
,却
ORDER BY b
)
Using temporary
:创建临时表,多见于
GROUP BY
、
DISTINCT
、
UNION
或某些
JOIN
场景;若出现在简单查询里,说明语句结构或索引设计有问题
Using index
是好消息,代表覆盖索引,无需回表;但要注意它和
Using where
共存时,说明 WHERE 条件部分用了索引、部分没用上 真正难的不是看懂单个字段,而是把
type
、
key
、
rows
、
Extra
四者交叉验证——比如
type = ref
但
rows
极高,说明索引区分度差;
key
有值但
Extra
仍有
Using filesort
,说明排序字段未纳入索引。这些组合信号,才是调优的关键入口。

相关文章