Explain语法:explain select … from … [where …]
例如:explain select * from news;
列 | JSON名称 | 含义 |
id |
| 该 |
select_type | None | 该 |
table |
| 输出行的表 |
partitions |
| 匹配的分区 |
type |
| 连接类型 |
possible_keys |
| 可供选择的索引 |
key |
| 实际选择的指数 |
key_len |
| 所选键的长度 |
ref |
| 列与索引进行比较 |
rows |
| 估计要检查的行 |
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名称(如果适用)。
| JSON名称 | 含义 |
| None | 简单SELECT(不使用 UNION或子查询) |
| None | 最 SELECT |
None | 第二次或以后的SELECT陈述 UNION | |
|
| a中的第二个或更晚的SELECT语句 UNION,取决于外部查询 |
|
| 的结果UNION。 |
SUBQUERY | None | 首先SELECT是子查询 |
|
| 首先SELECT在子查询中,依赖于外部查询 |
| None | 派生表 |
|
| 物化子查询 |
|
| 无法缓存结果的子查询,必须为外部查询的每一行重新计算 |
|
| 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。