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:表示未找到匹配的最小或最大行。