explain分析SQL执行计划

124 阅读5分钟

explain的结果有12列,分别是:

1,id

select查询序列号,标识SQL的执行顺序,从大到小执行。 id相同的是一组从上往下顺序执行,id越大优先级越高。

2,select_type

表示查询的类型。包括下列类型:

  • SIMPLE:简单查询,通常表示不包含子查询或联接操作的基本查询。
  • PRIMARY:主查询,通常表示最外层的查询。
  • SUBQUERY:子查询,表示一个子查询,通常出现在 WHERE 子句中的子查询。
  • DERIVED:派生表,表示使用了派生表(即嵌套查询)。
  • UNION:联合查询,表示使用了 UNION 或 UNION ALL 操作符的查询。
  • UNION RESULT:联合查询的结果集。
  • DEPENDENT SUBQUERY:依赖子查询,表示子查询的结果依赖于外部查询的值。
  • DEPENDENT UNION:依赖联合查询,表示联合查询的结果依赖于外部查询的值。
  • SUBQUERY N:多个子查询的情况下,每个子查询都有一个不同的编号(N)。
  • UNCACHEABLE SUBQUERY:不可缓存的子查询,表示子查询不能被缓存,通常因为它包含不稳定的函数或随机性操作。
  • MATERIALIZED:材料化子查询,表示子查询的结果被显式地存储在一个临时表中,以供后续查询使用。
  • REF:基于引用的查询,通常涉及多表连接,并使用了索引引用。
  • SYSTEM:系统表查询,表示查询系统表或信息模式。
3,table

表示查询涉及的表。这是被查询的表的名称或表的别名

4,partitions

表示查询涉及的分区。这是被查询的表的分区信息。

5,type

表示访问表的方式。这通常是性能分析中的一个关键指标。

  • const:常量访问,通常表示查询将仅访问一行数据,例如通过主键或唯一索引的等值查询条件。这是性能最佳的情况。
  • eq_ref:唯一引用,通常出现在连接操作中,表示查询将使用唯一索引来执行查询。性能非常好。
  • ref:引用,表示查询将使用非唯一索引或唯一索引的前缀部分来执行查询。通常用于连接操作。性能还可以。
  • range:范围扫描,通常出现在查询中带有范围条件的情况下。性能较好,但不如上述类型。
  • index:索引扫描,表示查询将使用索引来扫描表,但不是唯一索引或范围扫描。性能比全表扫描好。
  • index_merge:索引合并,表示多个索引将合并为一个索引来执行查询。性能较好。
  • unique_subquery:唯一子查询,表示子查询的结果是唯一的。性能取决于子查询的性能。
  • index_subquery:索引子查询,表示子查询将使用索引来执行。性能取决于子查询的性能。
  • range_subquery:范围子查询,表示子查询将执行范围扫描。性能取决于子查询的性能。
  • ALL:全表扫描,表示查询将扫描整个表,不使用索引。性能最差,特别是对于大表。
  • index_subquery:索引子查询,表示子查询将使用索引来执行。性能取决于子查询的性能。
  • system:系统表,通常表示查询系统表或信息模式,通常是不常见的操作。
  • NULL:没有可用的索引,表示查询没有可用的索引来加速访问,将进行全表扫描。
6,possible_keys

表示可能用于查询的索引。这是一组可能用于加速查询的索引列的名称。

7,key

表示实际用于查询的索引。这是数据库查询优化器选择的索引列。

8,key_len

表示索引键的长度。它表示用于查询的索引键的字节数。不损失精度的情况下,长度越短越好。

9,ref

表示在查询中使用的索引与表之间的连接匹配条件。即哪些列或常量被用于查询索引列上的值。

10, rows

表示估计的返回行数。这是查询优化器估计的将被检索的行数,通常用于性能估算。表示找到查询目标数据所需要读取的行数。

11,filtered

表示通过索引筛选的行的百分比。这表示查询优化器估计的将通过索引筛选的行的百分比。

12,Extra

用于解释查询执行的细节和特性。以下是一些常见的 Extra 字段值及其含义:

  • Using where:表示查询中使用了 WHERE 子句来过滤结果。
  • Using index:表示查询中使用了索引来执行排序操作。
  • Using temporary:表示查询中使用了临时表来存储中间结果。
  • Using filesort:表示查询中需要进行文件排序操作,通常需要额外的排序操作来满足查询条件。
  • Range checked for each record:表示对每个记录进行范围检查,通常出现在范围查询中。
  • Using join buffer (Block Nested Loop):表示使用了连接缓冲区,通常在连接操作中出现。
  • Using sort_union (Intersect):表示使用了排序联合操作来执行 INTERSECT 操作。
  • Using union (Union):表示使用了联合操作来执行 UNION 操作。
  • FirstMatch(alias) - Range checked for each record (index map: N):表示使用索引别名进行范围检查,并给出了相关的索引信息。
  • No tables used:表示查询中没有实际的表被使用,通常出现在优化查询的情况下。
  • Impossible WHERE noticed after reading const tables:表示查询中的 WHERE 子句被认为是不可能的条件,并且在读取常量表后才被注意到。
  • Select tables optimized away:表示查询中的表被优化掉,因为查询中的条件不需要访问任何表。
  • No matching min/max row:表示未找到匹配的最小或最大行。