暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译 ] MySQL 8.8.3扩展的EXPLAIN输出格式

原创 由迪 2021-04-23
276

EXPLAIN语句会产生额外的(“扩展”)信息,这些信息不是EXPLAIN输出的一部分, 但可以通过在SHOW WARNINGS 其后发出一条语句来查看EXPLAIN。在MySQL 8.0.12的,扩展的信息可用于 SELECTDELETEINSERTREPLACE,和 UPDATE语句。在8.0.12之前,扩展信息仅适用于 SELECT语句。

输出中 的MessageSHOW WARNINGS显示优化器如何限定SELECT语句 中的表名和列名, SELECT应用重写和优化规则后的外观以及有关优化过程的其他注意事项。

可在SHOW WARNINGS语句后面 显示的扩展信息 EXPLAIN仅针对 SELECT语句生成。 SHOW WARNINGS显示其他可解释语句空结果(DELETEINSERTREPLACE,和 UPDATE)。

这是扩展EXPLAIN输出的示例 :

mysql> EXPLAIN SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t1 type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 4 filtered: 100.00 Extra: Using index *************************** 2. row *************************** id: 2 select_type: SUBQUERY table: t2 type: index possible_keys: a key: a key_len: 5 ref: NULL rows: 3 filtered: 100.00 Extra: Using index 2 rows in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select `test`.`t1`.`a` AS `a`, <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in ( <materialize> (/* select#2 */ select `test`.`t2`.`a` from `test`.`t2` where 1 having 1 ), <primary_index_lookup>(`test`.`t1`.`a` in <temporary table> on <auto_key> where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a IN (SELECT t2.a FROM t2)` from `test`.`t1` 1 row in set (0.00 sec)
复制

由于显示的语句SHOW WARNINGS可能包含特殊标记以提供有关查询重写或优化程序操作的信息,因此该语句不一定是有效的SQL,也不打算执行。输出中可能还包含带有Message值的行,这些 值提供有关优化程序采取的操作的其他非SQL解释性说明。

以下列表描述了可以在扩展输出中显示的特殊标记SHOW WARNINGS

  • <auto_key>

    自动生成的临时表密钥。

  • <cache>(*expr*)

    表达式(例如标量子查询)执行一次,结果值保存在内存中以备后用。对于包含多个值的结果,可以创建一个临时表并<temporary table>显示它。

  • <exists>(*query fragment*)

    子查询谓词被转换为 EXISTS谓词,并且子查询被转换为可以与EXISTS谓词一起使用 。

  • <in_optimizer>(*query fragment*)

    这是一个内部优化器对象,对用户没有任何意义。

  • <index_lookup>(*query fragment*)

    使用索引查找来处理查询片段以查找合格的行。

  • <if>(*condition*, *expr1*, *expr2*)

    如果条件为true,则求值为 expr1,否则为 expr2

  • <is_not_null_test>(*expr*)

    验证表达式不等于的测试 NULL

  • <materialize>(*query fragment*)

    使用子查询实现。

  • ``materialized-subquery.*col_name*

    实现了*col_name*对内部临时表中列的引用, 以保存评估子查询的结果。

  • <primary_index_lookup>(*query fragment*)

    使用主键查找来处理查询片段以查找合格的行。

  • <ref_null_helper>(*expr*)

    这是一个内部优化器对象,对用户没有任何意义。

  • /* select#*N* */ *select_stmt*

    SELECT与在非扩展的行相关联EXPLAIN,其具有一输出id的值 N

  • *outer_tables* semi join (*inner_tables*)

    半联接操作。 *inner_tables*显示未拉出的表。请参见第8.2.2.1节“使用半联接转换优化IN和EXISTS子查询谓词”

  • <temporary table>

    这表示为缓存中间结果而创建的内部临时表。

当一些表格是constsystem类型,包括从这些表列的表达式是由早期的优化评估,并没有显示语句的一部分。但是,使用时FORMAT=JSON,某些 const表访问将显示为ref使用const值的访问。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论