【知识点007】mysql的explain命令
EXPLAIN 输出的常见列及含义
| 列名 | 含义 |
|---|---|
id |
查询中每个表的标识编号。值越大优先级越高(表示嵌套查询层级)。 |
select_type |
查询的类型(如 SIMPLE、PRIMARY、SUBQUERY、DERIVED 等)。 |
table |
当前正在访问的表名或临时表的别名。 |
partitions |
查询使用了哪些分区(如果表是分区表)。 |
type |
连接类型,反映了表访问方式,性能由好到差:system > const > eq_ref > ref > range > index > ALL。 |
possible_keys |
查询可能使用到的索引列表。 |
key |
实际使用到的索引名。NULL 表示没有使用索引。 |
key_len |
索引使用的字节长度(可用于判断联合索引是否完全使用)。 |
ref |
哪些列或常量被用于查找索引中的值。 |
rows |
MySQL 预计需要读取的行数。越小越好。 |
filtered |
每行过滤后保留的百分比(估算值),用于多表连接。 |
Extra |
额外信息,非常重要,显示如 Using index, Using where, Using temporary, Using filesort 等关键执行细节。 |
各列进一步说明
🔹 id
- 唯一编号:越大越先执行。
- 多表 join 时会有多个 id。
🔹 select_type
SIMPLE: 简单查询(无子查询或 UNION)PRIMARY: 最外层查询SUBQUERY: 出现在 SELECT/WHERE 中的子查询DERIVED: 派生表(子查询的结果作为临时表)UNION: UNION 中的第二部分及后续查询
🔹 type(访问类型)
访问表的方式,优化目标是越靠前越好:
| type | 含义(效率从高到低) |
|---|---|
| system | 表只有一行(等同于 const) |
| const | 常量引用(如主键查询) |
| eq_ref | 唯一索引等值连接 |
| ref | 非唯一索引等值连接 |
| range | 索引范围扫描(如 BETWEEN, <, >) |
| index | 全索引扫描(无 WHERE 过滤) |
| ALL | 全表扫描(最差,优化重点) |
🔹 Extra(额外信息)
常见值:
Using index: 覆盖索引,避免回表Using where: 使用了 WHERE 条件过滤Using temporary: 使用临时表(通常是 group by/order by 引起)Using filesort: 需要额外排序(不是通过索引排序)Using join buffer: 使用连接缓存(Nested Loop)
详细解释:
Using filesort: 本次查询语句中有order by,且排序依照的字段不在本次使用的索引中,不能自然有序。需要进行额外的排序工作。
Using index: 使用了覆盖索引——即本次查询所需的所有信息字段都可以从利用的索引上取得。无需回表,额外去主索引上去数据。
Using index condition: 使用了索引下推技术ICP。(虽然本次查询所需的数据,不能从利用的索引上完全取得,还是需要回表去主索引获取。但在回表前,充分利用索引中的字段,根据where条件进行过滤。提前排除了不符合查询条件的列。这样就减少了回表的次数,提高了效率。)
Using where: 表示本次查询要进行筛选过滤

浙公网安备 33010602011771号