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