MySQL执行计划分析(EXPLAIN)之Extra字段详细介绍说明

  • 内容
  • 评论
  • 相关

接上篇文章《MySQL执行计划分析(EXPLAIN)之type字段详细介绍说明》,这篇文章奶嘴就来聊聊在MySQL执行计划(EXPLAIN)另一个比较重要的字段Extra。

Extra字面意思为额外的信息,但其实在MySQL优化的工作中,这个字段输出的信息也非常之重要,下面奶嘴就位大家详细解析下该字段可能会出现哪些值,又有什么具体的含义。

Child of 'table' pushed join@1

这个表被引用为可以下推到NDB内核的连接中的表的子表。 只适用于MySQL NDB群集7.2及更高版本,当启用了下推连接时。

const row not found

对于SELECT … FROM tbl_name之类的查询,该表为空。

Deleting all rows

对于DELETE,一些存储引擎(如MyISAM)支持一个处理程序方法,该方法以一种简单而快速的方式删除所有表行。如果引擎使用此优化,则会显示此额外值。

Distinct

MySQL正在寻找不同的值,所以当它找到第一个匹配的行后,它停止为当前行组合搜索更多的行。

FirstMatch

对tbl_name进行了semi-join firstmatch优化,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个。

Full scan on NULL key

子查询优化,当优化器不能使用索引查找访问的时候,采用回退策略。

Impossible HAVING

HAVING子句始终为false,无法查询任何行。

Impossible WHERE

WHERE子句始终为false,无法查询任何行。

Impossible WHERE noticed after reading const tables

MySQL已经读取了所有const(和system)表,并发现where子句总是返回false。

LooseScan(m..n)

Semi-join 松散策略被使用,m 和 n 是key 的一部分。

No matching min/max row

没有满足查询条件的行,例如SELECT MIN(…)FROM … WHERE之类的条件结果行。

no matching row in const table

使用了join,有空表,或者在唯一索引条件下没有匹配上的行。

No matching rows after partition pruning

发生分区清理之后发现没有东西能够被delete或者update,和impossible where意思一样。

No tables used

查询中没有FROM子句,或者FROM DUAL子句。

Not exists

MySQL能够对查询执行LEFT JOIN优化,并且在找到与LEFT JOIN条件匹配的行之后,不会检查此表中针对上一行组合的更多行。 以下是可以通过以下方式优化的查询类型的示例:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

假设t2.id被定义为NOT NULL。在本例中,MySQL扫描t1并使用t1.id的值查找t2中的行。如果MySQL在t2中找到匹配的行,它就知道是t2.id永远不能为空,并且不会扫描t2中具有相同id值的其余行。换句话说,对于t1中的每一行,MySQL只需要在t2中执行一次查询,而不管t2中实际匹配多少行。

Plan isn't ready yet

当优化器尚未为在指定连接中执行的语句创建完执行计划时,EXPLAIN FOR CONNECTION将出现此值。如果执行计划输出包含多行,那么其中任何一行或所有一行都可能有这个额外的值,这取决于优化器在确定完整执行计划方面的进度。

Range checked for each record (index map: N)

MySQL发现没有好的索引可以使用,但发现在前面的表的列值已知后可能会使用某些索引。 对于上表中的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来检索行。 这不是很快,但比执行没有索引的连接更快。

Recursive

这表明该行应用于递归公共表表达式的递归SELECT部分。

Rematerialize

Rematerialize(X, …)显示在表t的执行计划中,其中X是在表t读取新一行时触发其Rematerialize的任何具体化派生表。例如:

SELECT
  ...
FROM
  t,
  LATERAL (derived table that refers to t) AS dt
  ...

每次top查询处理t表的新的一行,都会重新具体化派生表的内容,使其保持最新状态。

Scanned N databases

这表示在处理INFORMATION_SCHEMA表的查询时服务器执行的目录扫描数。 N的值可以是0,1或all。

Select tables optimized away

使用某些聚合函数来访问存在索引的某个字段时,优化器会通过索引直接一次定位到所需要的数据行完成整个查询,例如MIN()\MAX(),这种也是比较好的结果之一。

Skip_open_table, Open_frm_only, Open_full_table

这些值表示用于INFORMATION_SCHEMA表查询打开文件的优化。

  1. Skip_open_table 不需要打开表文件。通过扫描数据库目录,该信息已在查询中可用。
  2. Open_frm_only 只需要打开表的.frm文件。
  3. Open_full_table 未经优化的信息查找,必须打开.frm,.MYD和.MYI文件。

Start temporary, End temporary

这表示临时表用于半连接Duplicate Weedout策略。

unique row not found

对于类似于SELECT … FROM tbl_name之类的查询,没有行满足表唯一索引或主键的条件。

Using filesort

表示MySQL会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。 MySQL中无法利用索引完成的排序操作称为“文件排序”。

Using index

仅使用索引树中的信息从表中检索列信息,而不必另外寻找读取实际行。当查询仅使用属于单个索引的列时,可能使用这个策略。
对于具有用户定义的聚簇索引的InnoDB表,即使Extra列中不存在使用索引,也可以使用该索引。 如果type是index并且key是PRIMARY,则会出现这种情况。

Using index condition

会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。

Using index for group-by

与Using index table访问方法类似,Using group for group-by表示MySQL找到了一个索引,可用于检索GROUP BY或DISTINCT查询的所有列,而无需对实际表进行任何额外的磁盘访问。 此外,索引以最有效的方式使用,因此对于每个组,只读取少数索引条目。

Using index for skip scan

指示使用跳过扫描访问方法。《Skip Scan Range Access Method.

Using join buffer

将联接中的表分成几部分读入连接缓冲区,然后从缓冲区中使用它们的行来与当前表执行连接。 (Block Nested Loop)表示使用块嵌套循环算法,(Batched Key Access)表示使用批量密钥访问算法。 也就是说,来自EXPLAIN输出前一行的表中的键将被缓冲,匹配的行将从连接缓冲区的行的表中批量提取。

Using MRR

读取表时,使用了多范围读取优化策略 。

Using sort_union(…), Using union(…), Using intersect(…)

这些表示特定的算法,该算法显示如何合并index_merge连接类型的索引扫描。参见:《Section 8.2.1.3, “Index Merge Optimization”

Using temporary

在查询时,MySQL需要创建一个临时表来保存结果。经常出现在查询包含以不同方式列出列的GROUP BY和ORDER BY子句的情况。

Using where

在查找使用索引的情况下,需要回表去查询所需的数据,后再用WHERE子句完成结果过滤,通常出现这种情况的话就需要添加合适的索引来做优化了。

Using where with pushed condition

仅适用于NDB表。这意味着NDB集群使用条件下推优化来提高非索引列和常量之间直接比较的效率。在这种情况下,条件被“下推”到集群的数据节点,并在所有数据节点上同时进行评估。这消除了通过网络发送不匹配行的需要,并且可以将这种查询的速度提高5到10倍,这是在可以使用条件下推送但没有使用的情况下。

Zero limit

查询中存在LIMIT 0子句,无法选择任何行。

通常情况下当Extra中出现了Using filesort、Using temporary或Using where,则说明你写的SQL需要优化啦~


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注