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。在这种情况下,表列显示一个类似 的值,表示该行引用 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列中索引的位图,并且是冗余的)。

你可能感兴趣的:(mysql,数据库)