MySQL 语句 Explain 分析

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格式化EXPLAINSELECT类型公开 为a的属性 query_block,除非它是 SIMPLEPRIMARY表中还显示了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等价物 SIMPLEPRIMARY

select_typeSELECT语句 的显示受影响的表的语句类型。例如,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主键值与每个辅助索引一起存储。如果 keyNULL,MySQL没有找到用于更有效地执行查询的索引。

要强制MySQL使用或忽略列出的索引 possible_keys列,使用 FORCE INDEXUSE INDEXIGNORE 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输出格式

posted @ 2019-01-08 12:48  柔和的天空  阅读(929)  评论(0编辑  收藏  举报