目录
你想了解 MySQL 中分析 SQL 执行过程的核心关键字,以及对应的输出结果和解读方式,我会聚焦最常用、最高效的 2 个核心关键字(
EXPLAIN、EXPLAIN ANALYZE),清晰说明用法、输出内容和核心解读要点,兼顾实用性和易懂性。
一、核心关键字 1:EXPLAIN(最常用,查看执行计划)
1. 作用
EXPLAIN 是 MySQL 中分析 SQL 执行过程的基础关键字,用于查看 SQL 的执行计划(MySQL 优化器最终选择的执行方案),但不会实际执行 SQL(对于 SELECT 语句;对于 INSERT/UPDATE/DELETE,会解析但不会落地数据变更),可以快速定位 SQL 中的性能瓶颈(如是否走索引、全表扫描、关联查询效率等)。
2. 用法
直接在需要分析的 SQL 前加上 EXPLAIN 即可。
-- 基础用法:分析 SELECT 语句
EXPLAIN SELECT id, name, age FROM user_info WHERE age > 25 ORDER BY age DESC;
-- 分析关联查询
EXPLAIN SELECT u.id, u.name, o.order_amount
FROM user_info u
LEFT JOIN order_info o ON u.id = o.user_id
WHERE u.age > 30;
3. 输出内容(核心列解读)
EXPLAIN 执行后会返回一张表格(通常 10 列左右),核心列是日常优化的重点,无需记忆所有列,掌握以下 7 个核心列即可:
| 列名 | 核心含义 | 关键解读要点 |
|---|---|---|
id |
SQL 执行的优先级(查询语句的执行顺序) | 1. id 相同:从上到下依次执行;2. id 越大:优先级越高,先执行;3. 存在子查询时,id 会递增 |
select_type |
查询类型(区分普通查询、子查询、联表查询等) | 常见值: 1. SIMPLE:普通查询(无子查询、无联表)2. DERIVED:派生表(FROM 后的子查询)3. SUBQUERY:SELECT/WHERE 中的子查询4. JOIN:联表查询 |
table |
该执行步骤对应的表(或派生表、临时表) | 显示当前行操作的表名,若为派生表会显示 derived+id(如 derived2) |
type |
访问类型(核心优化指标,决定查询效率高低) | 性能从优到劣排序:system > const > eq_ref > ref > range > index > ALL⚠️ 重点:避免 ALL(全表扫描),至少要达到 range(范围扫描,如 where id > 10),最优是 ref/eq_ref(走索引匹配) |
possible_keys |
可能会用到的索引(MySQL 优化器预判的候选索引) | 显示该查询可能匹配的索引名,若为 NULL 表示无可用索引 |
key |
实际使用的索引(核心,确认索引是否真的生效) | 1. 若为 NULL:表示未使用任何索引(需优化)2. 若与 possible_keys 不一致:说明优化器选择了更优的索引 |
rows |
MySQL 预估需要扫描的行数(不是实际返回行数) | 数值越小越好,若数值过大(如接近表的总数据量),说明查询效率低(如全表扫描) |
补充:其他常用列
Extra:额外信息(重要优化参考)- 常见优值:
Using index(覆盖索引,无需回表,最优)、Using where(使用 WHERE 过滤) - 常见劣值:
Using filesort(文件排序,未用索引排序,需优化)、Using temporary(使用临时表,如 GROUP BY 未用索引,需优化)
- 常见优值:
key_len:实际使用的索引长度(数值越大,索引利用越充分)
4. 输出示例(简化版)
| id | select_type | table | type | possible_keys | key | rows | Extra |
|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | user_info | range | idx_age | idx_age | 100 | Using where; Using index |
解读:该查询是普通查询,访问 user_info 表,使用 range 访问类型(范围扫描),实际用到 idx_age 索引,预估扫描 100 行,使用 WHERE 过滤且命中覆盖索引,效率较高。
二、核心关键字 2:EXPLAIN ANALYZE(MySQL 8.0 新增,更精准,查看实际执行数据)
1. 作用
EXPLAIN ANALYZE 是 EXPLAIN 的增强版,会实际执行 SQL(返回真实执行数据),不仅能看到执行计划,还能获取「实际扫描行数」「实际执行时间」「循环次数」等精准数据,比 EXPLAIN 更贴近真实场景,适合 MySQL 8.0+ 版本的性能优化。
2. 用法
与 EXPLAIN 一致,前置在 SQL 前即可。
-- MySQL 8.0+ 支持
EXPLAIN ANALYZE SELECT id, name, age FROM user_info WHERE age BETWEEN 20 AND 30;
3. 输出内容(核心补充)
输出结果包含 EXPLAIN 的所有列,同时新增实际执行数据(核心补充如下):
Actual Time:实际执行时间(分为start(开始时间)和end(结束时间),单位:毫秒)Rows Actual:实际扫描的行数(与EXPLAIN的rows(预估)对比,判断优化器预估是否准确)Loops:执行循环次数(数值越小越好,通常为 1)
输出示例(简化版)
-> Filter: (user_info.age between 20 and 30) (cost=10.00 rows=100) (actual time=0.10..0.50 rows=95 loops=1)
-> Index range scan on user_info using idx_age (cost=10.00 rows=100) (actual time=0.08..0.45 rows=95 loops=1)
解读:实际扫描 95 行(预估 100 行),实际执行时间 0.10-0.50 毫秒,循环 1 次,走 idx_age 索引范围扫描,效率较高。
三、其他辅助关键字(了解即可)
DESCRIBE(简写DESC):与EXPLAIN功能完全一致,语法DESCRIBE SELECT ...,仅写法不同,日常使用较少。EXPLAIN FOR CONNECTION:分析当前正在执行的 SQL(通过SHOW PROCESSLIST获取连接 ID),适合分析慢查询的实时执行计划。-- 1. 获取连接 ID(假设为 123) SHOW PROCESSLIST; -- 2. 分析该连接的 SQL 执行计划 EXPLAIN FOR CONNECTION 123;
总结
- 分析 MySQL SQL 执行过程的核心关键字是
EXPLAIN(通用、不执行 SQL)和EXPLAIN ANALYZE(MySQL 8.0+、执行 SQL、更精准)。 EXPLAIN输出的核心关注type(访问类型)、key(实际索引)、rows(预估扫描行数)、Extra(额外信息),优先避免ALL(全表扫描)、Using filesort(文件排序)。EXPLAIN用于快速排查索引是否生效,EXPLAIN ANALYZE用于精准分析实际执行性能,两者结合是 MySQL SQL 优化的核心工具。
浙公网安备 33010602011771号