type = all 表示全表扫描,mysql 未使用索引,常见原因包括无索引、函数操作、隐式类型转换或 like '%abc' 等导致索引失效;需检查 key 和 possible_keys 是否为空。

EXPLAIN 为什么返回的 type 是 ALL
type = ALL 表示全表扫描,MySQL 没有使用任何索引去定位数据,这是性能杀手。常见原因包括:查询条件字段没建索引、用了函数或表达式(如 WHERE YEAR(create_time) = 2023)、隐式类型转换(比如对字符串字段用数字比较:WHERE status = 1,而 status 是 VARCHAR 类型)、或者索引失效(如 LIKE '%abc')。解决思路优先检查 EXPLAIN 输出中的 key 和 possible_keys 是否为空;若为空,基本确认索引未被使用。
如何看 Extra 字段里的 Using filesort 和 Using temporary
这两个提示说明 MySQL 在执行过程中需要额外排序或临时表,通常出现在 ORDER BY、GROUP BY 或含 DISTINCT 的语句里。Using filesort 不一定慢,但如果 rows 很大,就容易拖垮性能;Using temporary 更危险,尤其在高并发下会争抢内存和磁盘资源。优化方式包括:确保 ORDER BY 字段在联合索引最左前缀中(如 INDEX (a, b) 支持 ORDER BY a, b,但不支持 ORDER BY b);避免在 SELECT 中用非索引字段做 GROUP BY;减少 SELECT *,只查真正需要的列。
EXPLAIN FORMAT=TREE 与传统格式的区别
FORMAT=TREE 是 MySQL 8.0+ 引入的新格式,它用树状结构展示执行计划,能清晰看到连接顺序、物化子查询、聚合下推等高级优化行为。相比传统 EXPLAIN 的表格形式,它更贴近优化器真实决策路径。例如,你会看到 "-> Index lookup on t using idx_name (id=1)" 这样的可读性更强的描述。但注意:它不显示 key_len、rows 等关键估算值,调试索引长度或预估扫描行数时仍得切回默认格式;另外,如果 SQL 包含视图或 CTE,FORMAT=TREE 可能输出嵌套更深,需逐层展开看“是否下推”“是否物化”。
哪些操作会让 EXPLAIN 失效或不准
EXPLAIN 只模拟执行计划,不真正执行 SQL,因此某些依赖运行时信息的优化无法体现:
- 查询缓存(MySQL 8.0 已移除,但旧版本中
EXPLAIN不反映缓存命中) - 分区表的实际裁剪效果(
EXPLAIN PARTITIONS才能看到具体访问哪些分区) - 自适应哈希索引(AHI)是否启用,
EXPLAIN完全不体现 - 涉及存储过程、函数内联、或
INFORMATION_SCHEMA查询时,计划可能简化甚至报错 - 当
SQL_NO_CACHE或SQL_CACHE被显式指定,EXPLAIN仍按默认逻辑生成计划,不模拟缓存策略
真正压测前,别只信 EXPLAIN 的 rows 估算——它基于统计信息,而 ANALYZE TABLE 滞后或采样不准时,估算偏差可达十倍以上。









