MySQL中的EXPLAIN语句用于分析SELECT语句的执行计划,可以帮助用户判断查询效率并作出相应的优化。
EXPLAIN语法格式:
EXPLAIN SELECT ...;
执行计划包含的信息:
- table:查询涉及的表
- type:访问类型(系统、联合、索引等)
- possible_keys:可能使用的索引
- key:实际使用的索引
- key_len:索引长度
- rows:扫描行数
- extra:额外信息
例1:
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO users VALUES
(1, 'John'),(2, 'Emma'), (3, 'Brad'), (4, 'Travis');
EXPLAIN SELECT * FROM users WHERE name = 'John';
输出:
+----+-------------+-------+------------+------+---------------+------+---------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | rows |
+----+-------------+-------+------------+------+---------------+------+---------+-------+
| 1 | SIMPLE | users | NULL | ref | PRIMARY | name | 303 | 1 |
+----+-------------+-------+------------+------+---------------+------+---------+-------+
解析:
- table:users 访问users表
- type:ref 根据name字段的值查找数据
- possible_keys:PRIMARY 可能使用主键索引
- key:name 实际使用name索引
- key_len:303 索引长度
- rows:1 预计返回1条数据
例2:
sql
SELECT * FROM users WHERE name > 'M';
输出:
+----+-------------+-------+------------+------+---------------+------+---------+------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | rows |
+----+-------------+-------+------------+------+---------------+------+---------+------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | 3 |
+----+-------------+-------+------------+------+---------------+------+---------+------+
解析:
- type:ALL 全表扫描
- possible_keys:NULL 没有可用索引
- key:NULL 未使用索引
- key_len:NULL 索引长度(全表扫描,无索引)
- rows:3 预计返回3条数据
EXPLAIN的重要作用:
- 分析当前SELECT查询语句的执行计划,判断是否有性能问题。
- 根据ANALYZE оптimize次数,判断是否应该添加新的索引来提高性能。
- 比较不同SQL的EXPLAIN结果,选取最优的执行计划。
- 监控数据库性能,发现性能下降的原因。