explain extended输出格式详解 - xiaoboluo768/qianjinliangfang GitHub Wiki

  • 该小节主要讲解explain extended语句输出执行计划之后,使用show warnings查看到的查询优化器内部改写过后的SQL语句,其中包含了一些注释符号的含义解释

    • extended扩展关键字在5.7中默认开启,后续该关键字可能被移除,目前为了向后兼容,该语法仍然保留,但show warnings语句可以查看到一个提示性的警告语句告知这个是一个废弃的功能。
    • extended扩展功能目前只支持查看select语句,对于DML和replace语句,目前不支持查看相关内部改写的信息
    • 因为SHOW WARNINGS显示的语句可能包含特殊标记以提供有关查询重写或优化程序操作的信息,所以该语句可能不是有效的SQL,并且不会把该改写SQL直接用于内部执行。 输出信息还可以包括关于优化器采取的动作的附加非SQL解释性注释的Message值的行
  • 示例:

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)
  • explain extended的show warnings查看结果相关信息详解
 <auto_key>:临时表自动创建的索引
 <cache>(expr):表示执行了一次表达式(例如标量子查询),结果值保存在内存中以供以后使用。对于由多个值组成的结果集,\
可能会创建一个临时表来代替,如果被创建临时表来代替临时保存在内存中的话,那么你您看到的就是<temporary table>而不是<cache>(expr)
 <exists>(query fragmen):subquery谓词将转换为EXISTS谓词,并且subquery语句将进行转换,以便可以与EXISTS谓词一起使用
 <in_optimizer>(query fragment):这是一个没有用户意义的内部优化器对象
 <index_lookup>(query fragment):使用索引查找处理查询片段以查找匹配行
 <if>(condition,expr1,expr2):如果条件为真,则求值为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与具有id值为N的非extended EXPLAIN输出中的行相关联(注意,指的是explain输出结果中的行,N代表行的id号,不是数据行)
 outer_tables semi join(inner_tables):半连接操作。 inner_tables表示嵌套循环中的驱动表
 <temporary table>:这表示为缓存中间结果而创建的内部临时表
  • 当一些表是const或system查询类型时,涉及这些表中的列的表达式由优化器提前评估,所以可能执行extended之后,show warnings结果显示不出来相关的内部信息。但是,如果使用FORMAT = JSON,在输出结果中可以显示一些内部信息,但是一些使用const值的const表访问类型可能被显示为ref访问类型

上一篇:Extra列值详解 | 结束

⚠️ **GitHub.com Fallback** ⚠️