在 MySQL 中,EXPLAIN
是一个非常有用的命令,用于分析 SQL 查询的执行计划。通过 EXPLAIN
,可以了解 MySQL 是如何执行查询的,包括表的访问顺序、使用的索引、连接类型等信息。这对于优化查询性能非常有帮助。
EXPLAIN [SQL查询语句];
例如:
EXPLAIN SELECT * FROM users WHERE age > 25;
EXPLAIN
的输出结果通常包含以下字段:
id
id
。一般来说,id
越小,查询的优先级越高。
select_type
SIMPLE
:简单查询,不包含子查询或联合查询。PRIMARY
:最外层的查询。SUBQUERY
:子查询中的第一个 SELECT
。DERIVED
:派生表(子查询在 FROM
子句中)。UNION
:联合查询中的第二个及后续的 SELECT
。UNION RESULT
:联合查询的结果。
table
partitions
type
ALL
:全表扫描,性能最差。index
:索引全扫描,比全表扫描稍好,但仍然需要扫描整个索引。range
:索引范围扫描,比全索引扫描好,但仍然需要扫描部分索引。ref
:非唯一索引扫描,使用索引查找特定值。eq_ref
:唯一索引扫描,通常用于主键或唯一索引。const
:常量扫描,通常用于主键或唯一索引的等值查询。system
:表中只有一行数据,性能最好。
possible_keys
key
key_len
ref
const
,表示使用了常量值。
rows
filtered
Extra
Using index
:表示使用了覆盖索引,不需要回表查询。Using where
:表示使用了 WHERE
子句过滤数据。Using temporary
:表示需要创建临时表来存储中间结果。Using filesort
:表示需要进行文件排序操作,性能较差。Using join buffer
:表示使用了连接缓冲区。Impossible WHERE
:表示 WHERE
子句的条件永远不成立。
假设有一个 users
表,包含以下字段:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(50),
INDEX idx_age (age)
);
执行以下查询:
EXPLAIN SELECT * FROM users WHERE age > 25;
可能的输出结果如下:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | users | NULL | range | idx_age | idx_age | 4 | NULL | 100 | 100.00 | Using where |
解释:
id
:1,表示这是最外层的查询。select_type
:SIMPLE,表示这是一个简单查询。table
:users,表示查询涉及的表。type
:range,表示使用了索引范围扫描。possible_keys
:idx_age,表示可能使用的索引。key
:idx_age,表示实际使用的索引。key_len
:4,表示索引的长度。rows
:100,表示估计需要扫描的行数。filtered
:100.00,表示过滤后的行数比例。Extra
:Using where,表示使用了 WHERE
子句过滤数据。
检查索引
possible_keys
和 key
都为空,表示没有使用索引,需要考虑添加索引。
减少扫描行数
rows
的值。可以通过优化查询条件或调整索引结构来实现。
避免全表扫描
type
是 ALL
,表示进行了全表扫描,性能较差。尽量通过索引优化查询。
减少临时表和文件排序
Extra
中包含 Using temporary
或 Using filesort
,表示查询性能较差。可以通过优化查询或调整索引结构来避免这些操作。
覆盖索引
Extra
中会显示 Using index
。
通过 EXPLAIN
命令,可以深入了解 MySQL 的查询执行计划,从而优化查询性能。