MySQL EXPLAIN 使用详解与执行计划分析优化
一、什么是 EXPLAIN?
EXPLAIN
是 MySQL 提供的 SQL 语句分析工具,可以显示 SQL 语句在执行时的执行计划,包括表的访问顺序、使用的索引、连接类型、扫描行数等。通过分析 EXPLAIN 的输出结果,可以帮助我们发现 SQL 性能瓶颈,进行有针对性的优化。
二、EXPLAIN 的基本用法
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';
或者
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE email = '[email protected]';
三、EXPLAIN 输出字段详解
字段 | 含义 |
---|---|
id | 查询中每个 SELECT 子句的标识符,越大优先级越高 |
select_type | 查询类型(SIMPLE、PRIMARY、SUBQUERY、UNION等) |
table | 当前访问的表名或别名 |
partitions | 匹配的分区(如有分区表) |
type | 连接类型,反映表的访问方式(性能由好到差:system > const > eq_ref > ref > range > index > ALL) |
possible_keys | 可能用到的索引 |
key | 实际使用的索引 |
key_len | 使用索引的长度 |
ref | 哪个字段或常量与 key 一起使用 |
rows | 预估需要读取的行数 |
filtered | 经过条件过滤后剩余的百分比(MySQL 5.7+) |
Extra | 额外信息,如 Using index、Using where、Using filesort、Using temporary 等 |
四、type 连接类型说明(性能由好到差)
- system/const:表只有一行数据或主键等值查询,效率最高
- eq_ref:唯一索引等值查询
- ref:非唯一索引等值查询
- range:范围查询(如 between、>、<、in)
- index:全索引扫描
- ALL:全表扫描,性能最差
优化目标:
尽量让 type 为 const
、eq_ref
、ref
或 range
,避免 ALL
。
五、EXPLAIN 结果分析案例
1. 全表扫描(ALL)
EXPLAIN SELECT *