mysql explain执行结果示例:
字段详解
id
查询的序列号,标识 SQL 语句中不同子查询或操作的执行顺序。
- 若
id相同,执行顺序从上到下;若不同,值越大的优先级越高(如子查询或复杂连接)。 - 示例:
id=1表示主查询,id=2可能是子查询或联合查询的一部分。
select_type
查询类型,反映查询结构的复杂性。
- 常见值:
- SIMPLE:简单 SELECT,不含子查询或 UNION。
- PRIMARY:最外层查询。
- SUBQUERY:子查询中的第一个 SELECT。
- DERIVED:FROM 子句中的派生表(如子查询生成的临时表)。
- UNION 与 UNION RESULT:联合查询的第二部分及结果合并操作。
table
当前操作涉及的表名或别名。
- 若为派生表或子查询,可能显示
<derivedN>或<unionM,N>(N、M 为子查询的 id)。
partitions
显示查询涉及的分区信息,尤其当查询基于分区表时,该字段会明确列出实际访问的分区名称。需要支持分区表功能且使用了,可通过show plugins;查看是否有patitions插件(一般5.7+版本有)
type
数据访问方式,按效率从高到低排序:
- system:表仅一行(如系统表)。
- const:通过主键或唯一索引匹配单行(如
WHERE id=1)。 - eq_ref:联表查询时,被驱动表通过主键/唯一索引等值匹配(如
JOIN ON a.id=b.id)。 - ref:普通索引等值匹配,可能返回多行 。
- range:索引范围扫描(如
BETWEEN、IN)。 - index:全索引扫描(遍历索引树)。
- ALL:全表扫描,效率最低,需优化 。
possible_keys
查询可能使用的索引列表。
- 若为空(NULL),说明无适用索引,需考虑优化表结构或添加索引。
key
实际使用的索引。
- 若为空(NULL),表示未使用索引,可能导致性能问题。
key_len
索引使用的字节长度,反映索引利用情况。
-
计算公式:
- 固定长度类型(如 INT)直接取字节数。
- 可变长度类型(如 VARCHAR)需额外加 2 字节存储长度信息 。
- 若字段可为 NULL,再加 1 字节 。
-
示例:
VARCHAR(50)且可为 NULL 时,字符编码集为utf8mb4:key_len=50 * 4(utf8mb4)+2+1=203。查看表字符编码show table status from $database like '$table';
ref
索引列与那些列或常量比较。
- 常见值:
const(常量)、列名(如table.column)或NULL(未关联)。
rows
预估需要扫描的行数。数值越小越好,但为估算值,可能与实际有偏差。
Extra
额外信息,反映查询执行细节。
- 关键值:
- Using index:覆盖索引(无需回表)。
- Using where:需通过 WHERE 条件过滤结果 。
- Using temporary:使用临时表(常见于排序或分组)。
- Using filesort:外部排序(需优化索引或查询条件)。
- Using join buffer:联表时使用缓存,可能需调整索引或表结构 。
- Using index condition:查询的列不完全被索引覆盖,需要回表查询。
- Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时出现。