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
列显示一个值 ,表示该行引用值为和的行的 并集 。 <union
M
,N
>id
M
N
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 |
dependent (true ) |
a中的第二个或更晚的SELECT 语句 UNION ,取决于外部查询 |
UNION RESULT |
union_result |
的结果UNION 。 |
SUBQUERY |
None | 首先SELECT 是子查询 |
DEPENDENT SUBQUERY |
dependent (true ) |
首先SELECT 在子查询中,依赖于外部查询 |
DERIVED |
None | 派生表 |
MATERIALIZED |
materialized_from_subquery |
物化子查询 |
UNCACHEABLE SUBQUERY |
cacheable (false ) |
无法缓存结果的子查询,必须为外部查询的每一行重新计算 |
UNCACHEABLE UNION |
cacheable (false ) |
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
)
输出行引用的表的名称。这也可以是以下值之一:
<union
:行指的是M
,N
>id
值为M
和的行 的 并集 N
。
<derived
:该行是指用于与该行的派生表结果N
>id
的值 N
。例如,派生表可以来自FROM
子句中的子查询 。
<subquery
:行指的是N
>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
。
文章来源:EXPLAIN输出格式