MySQL使用explain需要关注的指标及其含义

🎯 EXPLAIN 关键指标与含义

指标 (Field) 含义 (Meaning) 优化关注点 理想值
id 查询中每个 SELECT 语句的编号。 用于识别子查询、联合查询或衍生表(Derived Table)的执行顺序。编号越大越先执行,相同编号按顺序执行。 越高越好(指查询的层级/复杂性)。
select_type 查询的类型,例如是简单查询、子查询、联合查询等。 识别查询的复杂性。不同的类型可能需要不同的优化策略。 SIMPLE (最简单)
table 正在访问的表名。 标识查询针对哪个表。 实际的表名。
type 连接类型 (Connection Type)访问类型 (Access Type) ,这是最重要的指标之一。它表明 MySQL 如何查找表中的行。 至关重要! 决定了查询效率。从好到差的顺序大致是:system/const > eq_ref > ref > range > index > ALL const , eq_ref , ref , range
possible_keys 可能被用于查找的索引列表。 提示您可以创建或检查哪些索引。 至少有一个或多个索引。
key 实际被选用的索引 。如果为 NULL,则表示没有使用索引。 检查 MySQL 是否选择了最佳索引。如果 possible_keys 有值而 keyNULL,需要优化。 一个合适的索引名。
key_len 实际使用的索引长度(字节)。 用于判断联合索引中使用了多少字段。key_len 越小,说明索引覆盖越精确,效率越高。 尽可能短,能满足查询需求即可。
ref 指示与索引的哪一列(或常量)进行比较。 常量 (const)、来自其他表的列 (db.table.column)。 const 或指向主键/唯一键的列。
rows MySQL 估计需要检查的行数。 至关重要! rows 越少越好,它是衡量查询性能的核心指标之一。 越小越好。
filtered 表示通过当前表条件过滤后,剩余的行数占总扫描行数 (rows) 的百分比。 filtered 越高越好 (接近 100%),说明查询条件过滤掉了大部分行。 100.00
Extra 额外信息,包含不适合在其他列中显示的信息,通常是非常关键的优化提示 检查是否有负面 信息,如 Using temporaryUsing filesort。追求正面 信息,如 Using indexUsing where Using index, Using where

⚠️ 特别关注的指标和值

在进行查询优化时,应将注意力集中在以下几个方面:

1. type 访问类型 (Access Type)

这是判断查询性能最重要且最直接的指标。

  • 🏆 优秀类型:

    • const / system: 命中主键或唯一索引,且是常量值比较。极快
    • eq_ref: 联接使用唯一索引。常用于联接操作,非常好
    • ref: 联接使用非唯一索引。良好
  • 👍 可接受类型:

    • range: 索引范围扫描,如 BETWEEN<>IN 等操作。一般
    • index: 全索引扫描,比 ALL 好,因为它只扫描索引树。较差
  • 👎 差劲类型 (需要优化):

    • ALL: 全表扫描。这是性能最低的类型,应尽力避免,通常意味着缺失索引或索引使用不当。

2. rows 扫描行数

  • 原则: 扫描的行数越少越好。如果 rows 值很大,即使 type 不是 ALL,也可能表明查询效率不高。

3. Extra 额外信息

您应该特别注意并消除以下负面信息:

  • Using filesort: 表示 MySQL 对结果集进行了外部排序(在内存或磁盘上),通常是低效的 。应尝试在 ORDER BY 的列上创建索引来消除。
  • Using temporary: 表示 MySQL 需要创建一个临时表来处理查询,通常是低效的 。常见于 GROUP BYORDER BY 与不同表联接字段混合使用时。

您应该追求以下正面信息:

  • Using index (覆盖索引): 表示查询所需的所有数据都可以在索引中找到,而无需回表 (Full Index Scan),性能极佳
  • Using where: 表示使用了 WHERE 条件对数据进行了过滤。
  • Using index condition (ICP): 表示在存储引擎层而非 Server 层进行索引条件判断,性能优化

总结来说,一个优化的查询应该努力达到:type 接近 const/eq_ref/ref/rangerows 值尽可能小 ,并且 Extra 中不包含 Using filesortUsing temporary ,最好能实现 Using index

相关推荐
萧曵 丶2 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
kaico20185 小时前
MySQL的索引
数据库·mysql
资生算法程序员_畅想家_剑魔6 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
霖霖总总7 小时前
[小技巧14]MySQL 8.0 系统变量设置全解析:SET GLOBAL、SET PERSIST 与 SET PERSIST_ONLY 的区别与应用
数据库·mysql
alonewolf_997 小时前
深入剖析MySQL索引底层:B+树、联合索引与跳跃扫描原理全解
数据库·b树·mysql
oMcLin7 小时前
如何在Debian 11上通过配置MySQL 8.0的分布式架构,提升跨区域数据同步的效率与延迟?
分布式·mysql·debian
计算机学姐8 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
霖霖总总9 小时前
[小技巧23]全面理解 MySQL 的 WAL 机制:原理、影响与可观测性
数据库·mysql
冰暮流星9 小时前
sql语句之select语句的基本使用
数据库·sql·mysql
计算机毕设指导610 小时前
基于微信小程序的钓鱼论坛系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven