【MapSheep】
[好记性不如烂笔头]


你想了解 MySQL 中分析 SQL 执行过程的核心关键字,以及对应的输出结果和解读方式,我会聚焦最常用、最高效的 2 个核心关键字EXPLAINEXPLAIN 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 ANALYZEEXPLAIN 的增强版,会实际执行 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 的所有列,同时新增实际执行数据(核心补充如下):

  1. Actual Time:实际执行时间(分为 start(开始时间)和 end(结束时间),单位:毫秒)
  2. Rows Actual:实际扫描的行数(与 EXPLAINrows(预估)对比,判断优化器预估是否准确)
  3. 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 索引范围扫描,效率较高。


三、其他辅助关键字(了解即可)

  1. DESCRIBE(简写 DESC):与 EXPLAIN 功能完全一致,语法 DESCRIBE SELECT ...,仅写法不同,日常使用较少。
  2. EXPLAIN FOR CONNECTION:分析当前正在执行的 SQL(通过 SHOW PROCESSLIST 获取连接 ID),适合分析慢查询的实时执行计划。
    -- 1. 获取连接 ID(假设为 123)
    SHOW PROCESSLIST;
    -- 2. 分析该连接的 SQL 执行计划
    EXPLAIN FOR CONNECTION 123;
    

总结

  1. 分析 MySQL SQL 执行过程的核心关键字EXPLAIN(通用、不执行 SQL)和 EXPLAIN ANALYZE(MySQL 8.0+、执行 SQL、更精准)。
  2. EXPLAIN 输出的核心关注 type(访问类型)、key(实际索引)、rows(预估扫描行数)、Extra(额外信息),优先避免 ALL(全表扫描)、Using filesort(文件排序)。
  3. EXPLAIN 用于快速排查索引是否生效,EXPLAIN ANALYZE 用于精准分析实际执行性能,两者结合是 MySQL SQL 优化的核心工具。
posted on 2026-02-03 16:54  (Play)  阅读(13)  评论(0)    收藏  举报