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:派生表(子查询的结果作为临时表)。
    • UNIONUNION 中的查询。
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. 重点关注字段 :如 typerowsExtra,避免全表扫描和文件排序。
  3. 索引是优化的核心:确保查询条件充分利用索引。

SQL 优化的核心原则

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

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


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

相关推荐
悲伤小伞17 分钟前
9-MySQL_索引
linux·数据库·c++·mysql·centos
霖霖总总23 分钟前
[Redis小技巧24]Redis主从复制深度解剖:不只是SLAVEOF,Redis主从复制背后的RunID、Backlog
数据库·redis
不吃香菜学java35 分钟前
苍穹外卖-菜品分页查询
数据库·spring boot·tomcat·log4j·maven·mybatis
狼与自由35 分钟前
Redis 分布式锁
数据库·redis·分布式
skiy44 分钟前
redis 使用
数据库·redis·缓存
java修仙传1 小时前
数据库和缓存的一致性如何保证?
redis·mysql·mybatis
mygljx1 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis
优选资源分享1 小时前
椒盐音乐 v11.1.0 丨安卓无广本地音乐播放器
android
奕成则成1 小时前
Redis 大 Key 问题排查与治理:原因、危害、实战方案
数据库·redis·缓存
Hoshino.411 小时前
基于Linux中的数据库操作——例题实操(3)
数据库