mySQL之explain命令实战
1. 实战
- SQL
1 | |
加索引之前:



[2025-10-29 10:37:46] 4 rows retrieved starting from 1 in 393 ms (execution: 40 ms, fetching: 353 ms)
执行加索引
1 | |
加索引后:



[2025-10-29 10:39:30] 4 rows retrieved starting from 1 in 403 ms (execution: 17 ms, fetching: 386 ms)
2. 如何阅读 EXPLAIN(步骤化)
运行:
1 | |
看输出的关键列(按优先级):
id/select_type- 标识查询的层次(主查询 / 子查询 / derived 等)。
- 如果看到
DEPENDENT SUBQUERY,说明子查询会对外层每行执行一次 —— 很慢。
table- 当前操作的表名或临时/derived 表。
type(非常重要)- 代表访问方式(从好到差):
system``const``eq_ref``ref``range``index``ALL。 ALL= 全表扫描(坏),ref/range/eq_ref表示使用索引(好)。
- 代表访问方式(从好到差):
possible_keys/key/key_lenpossible_keys:优化器可选的索引。key:实际用到的索引(若为空则未用索引)。key_len:使用了索引的长度(越多列越长,通常越好)。
rows- 优化器估算需读取的行数(估算值,不是实际)。大值表示会扫描大量数据。
Extra(非常关键的可读信号)Using where:使用 WHERE 筛选(正常)。Using index:覆盖索引(好,避免回表)。Using filesort:需要额外排序(可能慢,若可通过索引避免更好)。Using temporary:使用临时表(GROUP BY / ORDER BY 等导致,注意)。Using join buffer等也提示连接方式问题。
读法步骤(实际做法)
- 看主查询那行(
id最小):type如果是ALL→ 寻找能把它变成ref/range的索引(看 WHERE、JOIN、ORDER BY 的列)。Extra若出现Using filesort→ 考虑给ORDER BY的列建合适复合索引(按 WHERE 列次序 + order 列)。
- 看子查询(若有):
DEPENDENT SUBQUERY很糟 → 考虑改写为IN (subquery)或先取 role_id 再 join 小表。
- 看
possible_keys与key:- 若
possible_keys有值但key为空,说明有索引但没被选中,可能是列顺序或函数使用导致。
- 若
- 看
rows:若某一步rows值很大(百万级),那就是瓶颈所在表。 EXPLAIN FORMAT=JSON给更多细节(cost、filtered、attached_condition),适合复杂查询。
mySQL之explain命令实战
http://example.com/mySQL之explain命令实战/