• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • 扩展的 EXPLAIN 输出格式

    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. , t1.  IN (SELECT t2.  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
            Extr 	: 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
            Extr 	: 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显示未拉出的表。请参见“使用 EXISTS 策略优化子查询”。

    • <temporary table>

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

    当某些表属于constsystem类型时,涉及这些表中的列的表达式将由优化器尽早评估,并且不属于所显示语句的一部分。但是,使用时FORMAT=JSON,某些const表访问将显示为ref使用const值的访问。