在 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 的查询执行计划,从而优化查询性能。