大数跨境
0
0

【性能优化必备】MySQL 执行计划 EXPLAIN

【性能优化必备】MySQL 执行计划 EXPLAIN Linux运维技术之路
2025-11-15
11
导读:【性能优化必备】MySQL 执行计划 EXPLAIN当你发现某条 SQL 查询慢得让人怀疑人生时,你会怎么

 










 

【性能优化必备】MySQL 执行计划 EXPLAIN

当你发现某条 SQL 查询慢得让人怀疑人生时,你会怎么做?

👉 加索引?删索引?重写 SQL?

其实,这些都不能盲目操作。
第一步永远应该是:分析 SQL 的执行计划(EXPLAIN)。


一、什么是执行计划?

数据库执行一条 SQL 前,会评估各种执行方案,然后选择一个它认为“最便宜”的方式。

而 실행这个计划的内容,就是 EXPLAIN 告诉你的。

你可以把它理解成:

MySQL 告诉你:
“这条 SQL 我打算怎么跑,我会走哪个索引,我扫描多少行,你自己看看行不行。”

使用方法非常简单:


   
    
   EXPLAIN SELECT * FROM user WHERE name = 'Tom';

执行后你会看到一张关键指标表。


二、EXPLAIN 输出字段逐条讲透

执行计划的核心在于理解每一个列的意义。

下面逐条解释最重要的指标。


1、 type — 决定查询好坏的最核心指标之一!

表示 MySQL 扫描数据时采用的方式,效率从高到低如下:

type
说明
性能
system
表中只有一条记录
⭐⭐⭐⭐⭐
const
主键或唯一索引等值查询
⭐⭐⭐⭐⭐
eq_ref
多表 join 时使用主键
⭐⭐⭐⭐
ref
普通索引的等值查询
⭐⭐⭐⭐
range
范围查询(> < BETWEEN
⭐⭐⭐
index
全索引扫描
⭐⭐
ALL
全表扫描
❌ 最差

👉 一句话总结:

type 越靠前越好,出现 ALL 基本就慢了。


2、 possible_keys 与 key

  • • possible_keys:可能会使用的索引
  • • key:实际使用的索引

如果 key 为 NULL…

👉 你写的这条 SQL 很可能没用到索引!


3、 key_len(索引使用长度)

表示 MySQL 实际使用了联合索引的哪些字段。

例如你有索引 (name, age, city)
如果 key_len 只对应 name 的长度:

👉 说明只用到了第一个字段(很可能违反了最左前缀原则)


4、 rows(扫描行数)

表示 MySQL 预计要扫描多少行。

👉 rows 越大,SQL 越慢。

如果看到:


   
    
   rows: 100000

你就知道问题所在了。


5、 Extra(隐藏的重要信息)

常见关键提示:

Extra
含义
Using index
覆盖索引,最优
Using where
通过 where 条件过滤
Using index condition
索引条件过滤(ICP)
Using temporary
使用临时表(排序/分组)⚠️
Using filesort
文件排序(慢)⚠️⚠️
Using join buffer
连接缓冲区(join 索引不佳)⚠️

如果出现:


   
    
   Using temporary
Using filesort

👉 一定要优化!这是性能杀手!


三、实战:一条 SQL 从慢到快的进化

假设你有 SQL:


   
    
   SELECT * FROM order WHERE user_id = 10001 ORDER BY create_time DESC;

执行计划可能是:


   
    
   type: ALL
key: NULL
Extra: Using filesort

问题点非常明显:

❌ 全表扫描
❌ 无索引
❌ 排序还 filesort

索引优化:


   
    
   CREATE INDEX idx_user_time ON order(user_id, create_time);

查看执行计划:


   
    
   type: ref
key: idx_user_time
Extra: Using index

👉 瞬间从几十毫秒提升到 1 毫秒以内!


四、如何正确使用 EXPLAIN 优化 SQL?

牢记四步法:


1、 确认是否走了索引

看 key 是否为 NULL。


2、 查看扫描行数 rows

rows 越大,性能越差。


3、 看是否出现 Using filesort / Using temporary

出现了就说明 ORDER BY 或 GROUP BY 有问题。


4、 看 type,尽量不让它低于 range

ref / const 最理想。


五、总结

EXPLAIN 是用来分析 MySQL 执行 SQL 时选择的执行计划。
核心关注字段为:type、key、key_len、rows、Extra。
type 决定扫描方式,从好到差依次是 const、ref、range、index、ALL。
key 是否为 NULL决定是否用到索引。
Extra 中的 Using filesort / Using temporary 是优化重点。
通过 EXPLAIN,可以判断 SQL 是否走索引、是否全表扫描,并找出性能瓶颈,指导索引优化。

 




 

 


往期回顾


【声明】内容源于网络
0
0
Linux运维技术之路
专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
内容 347
粉丝 0
Linux运维技术之路 专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
总阅读663
粉丝0
内容347