【SQL优化】不再抓瞎!手把手教你读懂MySQL Explain执行计划

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文详解MySQL执行计划工具EXPLAIN,教你读懂其输出的“天书”表格。重点掌握四个核心指标:`type`(访问类型)、`key`(实际使用索引)、`Extra`(额外信息)和`rows`(扫描行数)。通过实战案例解析慢查询成因与优化方案,助你快速定位SQL性能瓶颈,写出高效数据库查询。

前言

写 SQL 很容易,写出高性能的 SQL 却很难。

当你发现接口响应慢了,第一反应肯定是:“这个 SQL 到底走了索引没?”

别去猜,MySQL 提供了最强大的诊断工具 —— EXPLAIN 命令。

它能模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 的。

今天我们就来破解 EXPLAIN 输出的那张“天书”表格,重点掌握 3 个最核心的指标

1. 怎么用?

用法超级简单,就在你的 SELECT 语句前面加上 EXPLAIN 即可。

SQL

EXPLAIN SELECT * FROM user WHERE id = 1;

执行后,你会看到类似下面的一张表:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE user const PRIMARY PRIMARY 4 const 1 NULL

这就是执行计划。接下来我们逐一拆解重点。


2. 核心指标一:type (访问类型) —— 性能的风向标

这是最重要的一列!它告诉我们 MySQL 是怎么查找数据的:是根据索引直接定位,还是苦逼地全表扫描?

性能从好到坏依次是:

  1. system / const (最快)
  • 含义: 只有一行匹配。
  • 场景: 根据 主键唯一索引 查询。
  • 例子: WHERE id = 1
  1. eq_ref
  • 含义: 使用主键或唯一索引进行的关联查询。
  • 场景: 多表连接时,连接条件是主键。
  1. ref (常见/合格)
  • 含义: 使用了普通索引(非唯一)。
  • 场景: WHERE name = 'Tom' (name 字段有索引)。
  1. range (必须达到)
  • 含义: 索引范围扫描。
  • 场景: BETWEEN, >, <, IN 等查询。
  • 例子: WHERE age > 18
  1. index (较差)
  • 含义: 全索引扫描。虽然没扫描数据行,但把整个索引树扫了一遍。
  • 场景: SELECT id FROM user (id是索引,但没加条件)。
  1. ALL (最差/必须优化)
  • 含义: 全表扫描 (Full Table Scan)
  • 场景: 没建索引,或者索引失效(如 LIKE '%张')。
  • 后果: 如果表有百万数据,这波操作就是灾难。

优化目标: 至少要达到 range 级别,最好能达到 ref


3. 核心指标二:key (实际使用的索引)

这一列告诉你真相:MySQL 到底有没有用你建的索引?

  • possible_keys:显示可能应用在这张表上的索引(理论值)。
  • key:实际使用的索引(实际值)。
  • 如果为 NULL,说明没走索引,快去检查 WHERE 条件!
  • 如果 possible_keys 有值但 key 为 NULL,说明 MySQL 觉得走索引比全表扫描还慢(通常发生在数据量很小,或者数据分布极不均匀时)。

4. 核心指标三:Extra (额外信息) —— 藏着魔鬼的细节

这一列包含了很多额外信息,注意看有没有出现以下**“红色警报”**:

  1. Using filesort (严重)
  • 含义: MySQL 无法利用索引完成排序,必须在内存或磁盘中进行额外的排序操作。
  • 后果: CPU 消耗巨大。
  • 解决:ORDER BY 的字段加上索引。
  1. Using temporary (严重)
  • 含义: 使用了临时表来保存中间结果。
  • 场景: 常见于 GROUP BYDISTINCT
  • 解决: 优化索引,避免创建临时表。
  1. Using index (好事)
  • 含义: 覆盖索引 (Covering Index)
  • 解释: 查询的列全都在索引树里就能找到,不需要回表去查数据行。这是查询性能的最高境界

5. 核心指标四:rows (扫描行数)

  • 含义: MySQL 预估为了找到你想要的数据,需要扫描多少行。
  • 解读: 这个数字越小越好。
  • 如果你查 1 条数据,rows 却是 10000,说明索引建立得很糟糕,或者区分度太低。

实战案例:读懂一个慢查询

假设 SQL 是:

SQL

SELECT * FROM order WHERE user_id = 100 ORDER BY create_time;

EXPLAIN 结果 A(优化前):

  • type: ALL
  • key: NULL
  • Extra: Using filesort
  • 分析: 全表扫描 + 文件排序,双重打击,必须死。

优化方案: 建立联合索引 idx_user_time (user_id, create_time)

EXPLAIN 结果 B(优化后):

  • type: ref (根据 user_id 查找)
  • key: idx_user_time
  • Extra: NULL (利用索引原本的顺序,避免了 filesort)
  • 分析: 完美!

总结

以后看 EXPLAIN,先看这三点:

  1. type 是不是 ALL?(是就得改)
  2. key 是不是 NULL?(是就加索引)
  3. Extra 有没有 filesort / temporary?(有就优化索引顺序)
相关文章
|
5月前
|
架构师 关系型数据库 MySQL
【Java架构师体系课 | MySQL篇】③ Explain执行计划详解
Explain用于分析SQL执行计划,通过模拟优化器行为揭示查询性能瓶颈。它展示索引使用、扫描行数等信息,帮助优化查询语句,提升数据库效率。
499 6
【Java架构师体系课 | MySQL篇】③ Explain执行计划详解
|
4月前
|
SQL 关系型数据库 MySQL
【数据库进阶】为什么你的SQL查询这么慢?索引失效的7个常见场景
本文总结MySQL索引失效的7大常见场景:模糊查询以%开头、索引列参与计算或函数、隐式类型转换、违背最左前缀法则、OR条件使用不当、不等号查询及全表扫描风险,并结合EXPLAIN工具教你如何诊断与优化,提升查询性能。
|
3月前
|
网络协议 Dubbo Java
从 TCP 到 RPC:彻底搞懂「HTTP 与 RPC用法区别」
本文深入剖析HTTP与RPC的本质区别,从TCP底层原理讲起,解析粘包拆包、协议封装等核心问题,梳理二者演进脉络。通过对比服务发现、传输性能、适用场景等维度,结合Dubbo、gRPC等框架,帮你按场景精准选型,彻底搞懂微服务通信的技术逻辑。
586 160
|
4月前
|
运维 Shell 应用服务中间件
【速查手册】Docker常用命令大全:这20%的命令解决了80%的问题
本文精炼总结 Docker 高频命令,按镜像管理、容器生命周期、排查调试、清理维护四大场景分类,详解常用参数与实战示例,附速查表,助你高效掌握核心操作,提升开发运维效率。
|
3月前
|
人工智能 安全 JavaScript
Qoder节省 Credits 的最佳实践
本文介绍如何高效节省AI编程工具(如Qoder、Cursor)的Credits资源。通过新开窗口处理无关任务、按需选择模型、优化代码结构、明确输出需求、及时终止跑偏任务及使用工程化回滚等技巧,有效降低Token消耗,提升开发效率与成本控制。
919 10
|
4月前
|
JSON NoSQL 关系型数据库
【技术选型】MongoDB vs MySQL:一场没有输家的“双雄对决”
本文深入对比MySQL与MongoDB的核心差异,从理念、性能到实战场景。MySQL严谨规范,适合高一致性业务;MongoDB灵活高效,契合多变需求。通过电商案例解析,揭示两者互补而非替代的关系,帮助开发者按场景选型,实现技术价值最大化。
|
JSON Java API
SpringCore 完整学习教程1,入门级别
本文是Spring Core的学习教程第一部分,涵盖了SpringApplication的使用、启动失败处理、延迟初始化、自定义SpringApplication、事件监听、Web环境、访问应用程序参数、使用ApplicationRunner或CommandLineRunner、应用程序退出码以及管理应用程序可用性状态等基本概念。
240 2
SpringCore 完整学习教程1,入门级别
|
SQL 关系型数据库 MySQL
【Mysql】 深入理解MySQL的执行计划
【Mysql】 深入理解MySQL的执行计划
565 4
|
Java
《Java工程师成神之路》电子版
《Java工程师成神之路(基础篇)》介绍了普通Java工程师必须要学习的相关知识点,包括面向对象和Java语言基础两大部分,涵盖基本数据类型、关键字、异常、I/O流、集合、反射、泛型和枚举......
911 0
 《Java工程师成神之路》电子版