Mysql-执行计划explain解释、explain各字段意思、执行计划explain输出列说明
explain输出列说明
- EXPLAIN 输出列
- 各列详解
-
- id (JSON name: select_id)
- select_type (JSON name: none)
- table (JSON name: table_name)
- partitions (JSON name: partitions)
- type (JSON name: access_type)
- possible_keys (JSON name: possible_keys)
- key (JSON name: key)
- key_len (JSON name: key_length)
- ref (JSON name: ref)
- rows (JSON name: rows)
- filtered (JSON name: filtered)
- Extra (JSON name: none)
EXPLAIN 输出列
当使用参数FORMAT=JSON时,key对应下面表格的JSON Name列
列 | JSON Name | 意义 |
---|---|---|
id | select_id | 选择标识符 |
select_type | None | 选择类型 |
table | table_name | 输出行的表 |
partitions | partitions | 匹配的分区 |
type | access_type | 加入类型 |
possible_keys | possible_keys | 可供选择的索引 |
key | key | 实际选择的索引 |
key_len | key_length | 所选索引的长度 |
ref | ref | 与索引相比的列 |
rows | rows | 估计要检查的行数 |
filtered | filtered | 按表条件过滤的行数的百分比 |
Extra | None | 附加信息 |
各列详解
id (JSON name: select_id)
选择标识符。这是查询中 SELECT 的序号。如果该行引用其他行的联合结果,则该值可以为 NULL。在这种情况下,表列显示一个类似 <unionM,N> 的值,表示该行引用 id 值为 M 和 N 的行的并集。
select_type (JSON name: none)
SELECT 的类型,可以是下表中显示的任何一种。 JSON 格式的 EXPLAIN 将 SELECT 类型公开为 query_block 的属性,除非它是 SIMPLE 或 PRIMARY。 JSON 名称(如果适用)也显示在表中。
select_type 值 | JSON Name | 意义 |
---|---|---|
SIMPLE | None | 简单 SELECT(不使用 UNION 或子查询) |
PRIMARY | None | 最外层的 SELECT |
UNION | None | UNION 中的第二个或之后的 SELECT 语句 |
DEPENDENT UNION | dependent (true) | UNION 中的第二个或后面的 SELECT 语句,取决于外部查询 |
UNION RESULT | union_result | UNION 的结果。 |
SUBQUERY | None | 子查询中的第一个 SELECT |
DEPENDENT SUBQUERY | dependent (true) | 子查询中的第一个 SELECT,依赖于外部查询 |
DERIVED | None | 派生表 |
DEPENDENT DERIVED | dependent (true) | 派生表依赖于另一个表 |
MATERIALIZED | materialized_from_subquery | 物化子查询 |
UNCACHEABLE SUBQUERY | cacheable (false) | 无法缓存结果且必须为外部查询的每一行重新评估的子查询 |
UNCACHEABLE UNION | cacheable (false) | 属于不可缓存子查询的 UNION 中的第二个或后面的选择(请参阅 UNCACHEABLE SUBQUERY) |
table (JSON name: table_name)
表名
partitions (JSON name: partitions)
查询将匹配记录的分区。对于非分区表,该值为 NULL。
type (JSON name: access_type)
- system(该表只有一行(=系统表)。这是 const 连接类型的特例。)。
- const(该表中最多有一个匹配行,例如primary key或者unique index)。
- eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)。
- ref(与eq_ref类似,区别在于不是使用primary key或者unique index,而是使用普通的索引)。
- ref_or_null(与ref类似,区别在于条件中包含对NULL的查询)。
- index_merge(索引合并优化)。
- unique_subquery(in的后面是一个查询主键字段的子查询)。
- index_subquery(与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询)。
- range(单表中的范围查询,用运算符 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()将字段和常量进行比较时)。
- index(对于前面的每一行,都通过查询索引来得到数据)。
- all(对于前面的每一行,都通过全表扫描来得到数据)。
possible_keys (JSON name: possible_keys)
指示 MySQL 可能会用到的索引来查找该表中的行
key (JSON name: key)
MySQL 实际决定使用的键(索引)
key_len (JSON name: key_length)
MySQL 决定使用的键的长度
ref (JSON name: ref)
表示将哪些列或常量与键列中指定的索引进行比较来从表中选择行。
rows (JSON name: rows)
表示 MySQL 认为它必须检查以执行查询的行数。
对于 InnoDB 表,这个数字是一个估计值,可能并不总是准确的。
filtered (JSON name: filtered)
按表条件过滤的表行的估计百分比。最大值为 100,这意味着没有发生行过滤。值从 100 开始减少表示过滤量增加。 rows 显示检查的估计行数,rows × filtered 显示与下表连接的行数。例如rows为1000,filtered为50.00(50%),则下表join的行数为1000×50%=500。
Extra (JSON name: none)
MySQL 如何解析查询的附加信息。
一下列举常见的几种:
- Using index(此值表示mysql将使用覆盖索引,以避免访问表)。
- Using where(mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引)。
- Using temporary(mysql 对查询结果排序时会使用临时表)。
- Using filesort(mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成)。
- Range checked for each record(index map: N) (没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的)。