EXPLAIN 查看一条 SQL 语句的执行计划,从而了解查询在执行时的访问方式和索引使用情况。下面对 EXPLAIN 输出中常见字段的含义进行说明。EXPLAIN
SELECT *
FROM user
WHERE id = 1;执行后会返回一行或多行结果,每一列都对应执行计划中的一个字段。
id 表示查询中每个 SELECT 子句的标识符:
id 值越大,越先执行
id 的查询按从上到下的顺序执行
在简单查询中,id 通常为 1。
select_type 表示查询的类型,常见取值包括:
SIMPLE:简单查询,不包含子查询或 UNION
PRIMARY:最外层的查询
SUBQUERY:子查询中的第一个 SELECT
DERIVED:派生表(FROM 子句中的子查询)
UNION:UNION 中的第二个及后续查询
该字段用于区分复杂查询中各个 SELECT 的角色。
table 表示当前行所访问的表名,可能是:
NULL(如不访问任何表的情况)
type 表示表的访问方式,是判断查询性能的重要字段之一。
常见类型按性能从好到差大致如下:
const:通过主键或唯一索引一次命中
eq_ref:使用唯一索引进行等值匹配
ref:使用非唯一索引
range:索引范围扫描
index:全索引扫描
ALL:全表扫描
一般情况下,应尽量避免 ALL。
possible_keys 表示 MySQL 在理论上可能使用的索引:
NULL 表示没有可用索引
该字段用于判断索引设计是否合理。
key 表示实际被 MySQL 使用的索引:
NULL 表示未使用索引
如果 possible_keys 有值但 key 为 NULL,通常需要检查查询条件。
key_len 表示 MySQL 使用的索引长度(单位为字节):
该字段与索引列的数据类型和长度有关。
ref 表示索引列与哪一列或常量进行比较:
const、字段名
rows 表示 MySQL 预估需要扫描的行数:
可用于对比不同 SQL 或索引方案的效率。
Extra 提供额外的执行信息,常见取值包括:
Using where:使用了 WHERE 过滤
Using index:使用覆盖索引
Using temporary:使用临时表
Using filesort:使用文件排序
其中 Using temporary 和 Using filesort 通常意味着额外的性能开销。
通过 EXPLAIN 可以了解:
在分析 SQL 执行情况时,应结合多个字段综合判断,而不是只关注单一指标。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。