MySQL执行计划explain结果详解

196 阅读3分钟

mysql explain执行结果示例:

Clipboard_Screenshot_1746699948.png

字段详解

id

查询的序列号,标识 SQL 语句中不同子查询或操作的执行顺序。

  • 若 id 相同,执行顺序从上到下;若不同,值越大的优先级越高(如子查询或复杂连接)。
  • 示例:id=1 表示主查询,id=2 可能是子查询或联合查询的一部分。

select_type

查询类型,反映查询结构的复杂性。

  • 常见值
    • SIMPLE:简单 SELECT,不含子查询或 UNION。
    • PRIMARY:最外层查询。
    • SUBQUERY:子查询中的第一个 SELECT。
    • DERIVED:FROM 子句中的派生表(如子查询生成的临时表)。
    • UNIONUNION RESULT:联合查询的第二部分及结果合并操作。

table

当前操作涉及的表名或别名。

  • 若为派生表或子查询,可能显示 <derivedN> 或 <unionM,N>(N、M 为子查询的 id)。

partitions

显示查询涉及的分区信息,尤其当查询基于分区表时,该字段会明确列出实际访问的分区名称。需要支持分区表功能且使用了,可通过show plugins;查看是否有patitions插件(一般5.7+版本有)

type

数据访问方式,按效率从高到低排序:

  • system:表仅一行(如系统表)。
  • const:通过主键或唯一索引匹配单行(如 WHERE id=1)。
  • eq_ref:联表查询时,被驱动表通过主键/唯一索引等值匹配(如 JOIN ON a.id=b.id)。
  • ref:普通索引等值匹配,可能返回多行 。
  • range:索引范围扫描(如 BETWEENIN)。
  • index:全索引扫描(遍历索引树)。
  • ALL:全表扫描,效率最低,需优化 。

possible_keys

查询可能使用的索引列表。

  • 若为空(NULL),说明无适用索引,需考虑优化表结构或添加索引。

key

实际使用的索引。

  • 若为空(NULL),表示未使用索引,可能导致性能问题。

key_len

索引使用的字节长度,反映索引利用情况。

  • 计算公式:

    • 固定长度类型(如 INT)直接取字节数。
    • 可变长度类型(如 VARCHAR)需额外加 2 字节存储长度信息 。
    • 若字段可为 NULL,再加 1 字节 。
  • 示例:VARCHAR(50) 且可为 NULL 时,字符编码集为utf8mb4:key_len=50 * 4(utf8mb4)+2+1=203。查看表字符编码show table status from $database like '$table';

ref

索引列与那些列或常量比较。

  • 常见值:const(常量)、列名(如 table.column)或 NULL(未关联)。

rows

预估需要扫描的行数。数值越小越好,但为估算值,可能与实际有偏差

Extra

额外信息,反映查询执行细节。

  • 关键值
    • Using index:覆盖索引(无需回表)。
    • Using where:需通过 WHERE 条件过滤结果 。
    • Using temporary:使用临时表(常见于排序或分组)。
    • Using filesort:外部排序(需优化索引或查询条件)。
    • Using join buffer:联表时使用缓存,可能需调整索引或表结构 。
    • Using index condition:查询的列不完全被索引覆盖,需要回表查询。
    • Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时出现。