MySQL EXPLAIN 详解:一眼看懂查询计划

在日常的数据库开发中,我们经常需要分析 SQL 查询性能,而 EXPLAIN 是 MySQL 提供的利器,可以帮我们快速理解查询计划,优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义,并结合实际案例分享优化思路。


一、什么是 MySQL EXPLAIN

EXPLAIN 是 MySQL 提供的一种查询分析工具,用来展示 SQL 查询的执行计划。它能直观地展示每个表的访问方式、索引的使用情况以及查询的执行顺序,帮助我们找出性能瓶颈。

使用方式:

sql 复制代码
EXPLAIN [你的SQL语句];

执行后会返回一张表格,展示查询执行的各项详细信息。


二、EXPLAIN 输出字段详解

以下是 EXPLAIN 的关键输出字段,每一列都表示不同的执行信息。

字段名 含义 优化建议
id 查询的执行顺序和优先级 优先优化 id 值大的语句
select_type 查询的类型 确保派生表和子查询的效率
table 当前步骤访问的表 注意优化复杂查询中的临时表
partitions 匹配的分区 分区表优化相关
type 表的访问方式(性能优劣排序) 避免 ALL 全表扫描
possible_keys 查询中可能使用的索引 确保查询条件中使用了索引列
key 实际使用的索引 若为 NULL,需检查是否需要创建索引
key_len 使用索引的长度 确保索引覆盖了查询条件
ref 索引比较对象 确保通过条件有效筛选
rows 预估需要扫描的行数 扫描行数越少,性能越高
filtered 返回结果占扫描行数的百分比 值越接近 100%,过滤条件越高效
Extra 补充信息,如临时表、排序等 避免使用临时表、文件排序

三、EXPLAIN 字段详解及优化策略
1. id
  • 含义:表示查询的执行顺序。
  • 特点 :
    • id 值越大,优先执行。
    • 同一 id 从上到下执行。
  • 优化建议 :优先优化 id 值较大的查询。
2. select_type
  • 常见值 :
    • SIMPLE:简单查询,没有子查询。
    • PRIMARY:最外层查询。
    • SUBQUERY:子查询。
    • DERIVED:派生表(子查询的结果作为临时表)。
    • UNION :UNION 中的查询。
3. type
  • 访问方式性能排序 :
    • 最佳 :system > const > eq_ref > ref > range > index > ALL。
    • ALL(全表扫描):性能最差,应尽量避免。
  • 优化方法 :
    • 确保查询条件使用索引,避免全表扫描。
4. Extra
  • 关键信息解读 :
    • Using index:使用覆盖索引,性能较优。
    • Using where :通过 WHERE 过滤条件筛选数据。
    • Using temporary:使用了临时表,需优化。
    • Using filesort:需要额外的排序步骤,尽量优化索引支持排序。

四、典型优化案例

以下通过实际案例,演示如何使用 EXPLAIN 分析和优化查询计划。

1. 优化全表扫描

原始查询:

sql 复制代码
EXPLAIN SELECT * FROM orders WHERE user_id = 1;

查询计划:

  • type=ALL 表示全表扫描。
  • 优化方法 :在 user_id 列上添加索引。
sql 复制代码
ALTER TABLE orders ADD INDEX idx_user_id(user_id);
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
2. 优化排序

原始查询:

sql 复制代码
EXPLAIN SELECT name FROM users WHERE age > 30 ORDER BY age DESC;

查询计划:

  • Extra=Using filesort 表示需要额外排序。
  • 优化方法 :在 age 列上添加索引。
sql 复制代码
ALTER TABLE users ADD INDEX idx_age(age);
EXPLAIN SELECT name FROM users WHERE age > 30 ORDER BY age DESC;
3. 子查询改写为 JOIN

原始查询:

sql 复制代码
EXPLAIN SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 30);

查询计划:

  • select_type=SUBQUERY,执行效率较低。
  • 优化方法 :改写为 JOIN 查询。
sql 复制代码
EXPLAIN SELECT o.* FROM orders o JOIN users u ON o.user_id = u.id WHERE u.age > 30;

五、总结
  1. EXPLAIN 是优化查询性能的重要工具,可以帮助我们清晰了解查询计划。
  2. 重点关注字段 :如 type、rows、Extra,避免全表扫描和文件排序。
  3. 索引是优化的核心:确保查询条件充分利用索引。

SQL 优化的核心原则:

  • 合理设计索引。
  • 避免全表扫描。
  • 避免子查询,尽量使用 JOIN 替代。

**实践是优化的关键!**希望本文能帮你一眼看懂查询计划,并在实际项目中助你优化 SQL 性能!


你可以通过留言分享你的优化案例或遇到的疑难问题,一起交流探讨!

相关推荐
Decay__2 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
驰骋工作流5 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
传奇开心果编程7 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁10 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk10 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW11 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
方白羽11 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app