Explain语法:explain select … from … [where …]

例如:explain select * from news;

 EXPLAIN输出列


JSON名称

含义

id

select_id

SELECT标识符

select_type

None

SELECT类型

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名: select_id)

SELECT标识符。这是SELECT查询中的序号 。NULL如果行引用其他行的联合结果,则该值可以是。在这种情况下,该 table列显示一个值 ,表示该行引用值为和的行的 并集 。 <unionM,N>idMN

select_type (JSON名称:无)

类型SELECT,可以是下表中显示的任何类型。JSON格式化EXPLAIN将SELECT类型公开 为a的属性 query_block,除非它是 SIMPLE或PRIMARY。表中还显示了JSON名称(如果适用)。

select_type 值

JSON名称

含义

SIMPLE

None

简单SELECT(不使用 UNION或子查询)

PRIMARY

None

最 SELECT

UNION

None

第二次或以后的SELECT陈述 UNION

DEPENDENT UNION

dependenttrue

a中的第二个或更晚的SELECT语句 UNION,取决于外部查询

UNION RESULT

union_result

的结果UNION。

SUBQUERY

None

首先SELECT是子查询

DEPENDENT SUBQUERY

dependenttrue

首先SELECT在子查询中,依赖于外部查询

DERIVED

None

派生表

MATERIALIZED

materialized_from_subquery

物化子查询

UNCACHEABLE SUBQUERY

cacheablefalse

无法缓存结果的子查询,必须为外部查询的每一行重新计算

UNCACHEABLE UNION

cacheablefalse

UNION 属于不可缓存的子查询的第二个或后一个选择(请参阅参考资料 UNCACHEABLE SUBQUERY)

 

DEPENDENT通常表示使用相关子查询。请参见 第13.2.11.7节“相关子查询”。

DEPENDENT SUBQUERY评估与评估不同UNCACHEABLE SUBQUERY。因为DEPENDENT SUBQUERY,子查询仅针对来自其外部上下文的变量的每组不同值重新评估一次。对于 UNCACHEABLE SUBQUERY

当您指定FORMAT=JSON时 EXPLAIN,输出没有直接等效的单个属性 select_type; 该 query_block属性对应于给定的SELECT。可以使用与SELECT刚显示的大多数子查询类型等效的属性(示例 materialized_from_subquery为 MATERIALIZED),并在适当时显示。没有JSON等价物 SIMPLE或PRIMARY。

select_type非SELECT语句 的值显示受影响的表的语句类型。例如,select_type是 DELETE用于 DELETE陈述。

table(JSON名: table_name)

输出行引用的表的名称。这也可以是以下值之一:

<unionM,N>:行指的是id值为M和的行 的 并集 N。

<derivedN>:该行是指用于与该行的派生表结果id的值 N。例如,派生表可以来自FROM子句中的子查询 。

<subqueryN>:行指的是id 值为的行的具体化子查询的结果N。请参见 第8.2.2.2节“使用实现优化子查询”。

partitions(JSON名: partitions)

记录将与查询匹配的分区。该值适用NULL于非分区表。请参见 第23.3.5节“获取有关分区的信息”。

type(JSON名: access_type)

连接类型。有关不同类型的说明,请参阅 EXPLAIN 连接类型。

possible_keys(JSON名: possible_keys)

该possible_keys列指示MySQL可以选择在此表中查找行的索引。请注意,此列完全独立于输出中显示的表的顺序 EXPLAIN。这意味着某些键possible_keys可能无法在生成中使用生成的表顺序。

如果此列是NULL(或在JSON格式的输出中未定义),则没有相关索引。在这种情况下,您可以通过检查WHERE 子句来检查它是否引用适合索引的某些列或列来提高查询性能。如果是,请创建适当的索引并EXPLAIN再次检查查询 。请参见 第13.1.9节“ALTER TABLE语法”。

要查看表的索引,请使用。 SHOW INDEX FROM tbl_name

key(JSON名:key)

该key列指示MySQL实际决定使用的密钥(索引)。如果MySQL决定使用其中一个possible_keys 索引来查找行,那么该索引将被列为键值。

可能key会命名值中不存在的索引 possible_keys。如果没有possible_keys索引适合查找行,则会发生这种情况,但查询选择的所有列都是其他索引的列。也就是说,命名索引覆盖了所选列,因此虽然它不用于确定要检索的行,但索引扫描比数据行扫描更有效。

因为InnoDB,即使查询还选择主键,辅助索引也可能覆盖所选列,因为InnoDB主键值与每个辅助索引一起存储。如果 key是NULL,MySQL没有找到用于更有效地执行查询的索引。

要强制MySQL使用或忽略列出的索引 possible_keys列,使用 FORCE INDEX,USE INDEX或IGNORE INDEX在您的查询。请参见第8.9.4节“索引提示”。

对于MyISAM表,运行 ANALYZE TABLE有助于优化器选择更好的索引。对于 MyISAM表格,myisamchk --analyze也是如此。请参见 第13.7.3.1节“ANALYZE TABLE语法”和 第7.6节“MyISAM表维护和崩溃恢复”。

key_len(JSON名: key_length)

该key_len列指示MySQL决定使用的密钥的长度。该值 key_len使您可以确定MySQL实际使用的多部分密钥的多少部分。如果key列说NULL,该len_len 列也说NULL。

由于密钥存储格式,对于可能NULL 比列的列,密钥长度更大NOT NULL。

ref(JSON名:ref)

该ref列显示哪些列或常量与列中指定的索引进行比较,以 key从表中选择行。

如果值为func,则使用的值是某个函数的结果。要查看哪个函数,请使用 SHOW WARNINGS以下内容 EXPLAIN查看扩展 EXPLAIN输出。该函数实际上可能是算术运算符等运算符。

rows(JSON名: rows)

该rows列指示MySQL认为必须检查以执行查询的行数。

对于InnoDB表格,此数字是估算值,可能并不总是准确的。

filtered(JSON名: filtered)

该filtered列指示将按表条件过滤的表行的估计百分比。最大值为100,这意味着不会对行进行过滤。值从100开始减少表示过滤量增加。 rows显示检查的估计行数,rows× filtered表示将与下表连接的行数。例如,如果 rows是1000并且 filtered是50.00(50%),则使用下表连接的行数是1000×50%= 500。

Extra (JSON名称:无)

此列包含有关MySQL如何解析查询的其他信息。有关不同值的说明,请参阅 EXPLAIN 附加信息。

没有与Extra列对应的单个JSON属性 ; 但是,此列中可能出现的值将作为JSON属性公开,或作为属性的文本公开message。