前置知识: MySQL

EXPLAIN输出详解

00:00
3 min Advanced 2026/6/14

MySQL EXPLAIN输出详解:type、key、rows、filtered、Extra字段的含义与性能诊断

1. EXPLAIN 输出列

含义
idSELECT 标识符
select_type查询类型
table访问的表
partitions匹配的分区
type访问类型(最重要)
possible_keys可能使用的索引
key实际使用的索引
key_len使用的索引长度
ref与索引比较的列或常量
rows估算扫描行数
filtered过滤比例
Extra额外信息

2. type 详解

从最优到最差:

type说明示例
system表中只有一行WHERE id = 1(单行表)
const主键/唯一索引查询WHERE id = 1
eq_refJOIN主键/唯一索引JOIN ON a.id = b.id
ref唯一索引查询WHERE dept_id = 5
fulltext全文索引MATCH ... AGAINST
ref_or_null类似 ref,额外搜索 NULLWHERE dept_id = 5 OR NULL
index_merge索引合并WHERE a=1 OR b=2
unique_subqueryIN 子查询优化为唯一索引查找WHERE id IN (SELECT ...)
index_subqueryIN 子查询优化为非唯一索引查找WHERE dept_id IN (...)
range范围扫描WHERE id > 100
index索引扫描ORDER BY id(无WHERE
ALL全表扫描索引条件

3. key 与 key_len

-- key:实际使用的索引名
-- key = NULL:未使用索引

-- key_len:使用的索引字节数
-- 可判断联合索引使用了几个列

-- 索引 (dept_id INT, name VARCHAR(50))
-- dept_id: 4字节 + 1字节(NULL标志) = 5
-- name: 50*3(utf8mb4) + 2(变长) + 1(NULL) = 153

-- key_len = 5:只用了 dept_id
-- key_len = 158:用了 dept_id + name

4. rows 与 filtered

-- rows:估算扫描行数
-- filtered:过滤比例(0.00-100.00)
-- 实际返回行 ≈ rows × filtered / 100

-- 示例:rows=1000, filtered=10.00
-- 实际返回约 100 行

5. Extra 详解

Extra 含义
Using index覆盖索引,无需回
Using whereServer 层过滤
Using index condition索引下推(ICP)
Using temporary使用临时
Using filesort额外排序(非索引排序)
Using join buffer使用连接缓冲区(Block Nested Loop)
Using MRR范围读优化
Using index for group-by索引用于 GROUP BY
Using where with pushed condition索引条件下推
Impossible WHEREWHERE 不可能为真
Select tables optimized away优化常量(如 MIN/MAX 使用索引

6. EXPLAIN ANALYZE

-- MySQL 8.0.18+:实际执行并返回真实数据
EXPLAIN ANALYZE
SELECT * FROM employees WHERE dept_id = 5;

-- 输出包含:
-- actual time:实际执行时间
-- actual rows:实际返回行数
-- loops:执行次数
-- 估算值 vs 实际值对比

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式