mysql最新版explain详解来自官网直译(5)

来源:互联网 发布:淘宝钻石展位多少钱 编辑:程序博客网 时间:2024/06/16 15:38
对于查询语句,Explain输出的额外扩展信息并不是Explain输出的一部分,而是需要通过SHOW Warning命令来查看,当执行EXPLAIN之后在执行即可。而输出的信息包含了优化器如何选择表和在查询中的列信息,在运用重写和优化规则之后的查询是怎么样的,还有一些可能的注意事项关于优化进程。
额外的信息值有对查询语句有效,在执行Explain之后通过SHOW WARNING命令查看信息,而对于其他语句比方说DELETE,UPDATE,REPLACE,INSERT等,show warning的结果为空。
注意:对于老版本的mysql.获取扩展信息的命令是EXPLAIN EXTENDED.该语法在新版本中依然识别,但是不推荐使用,而且在未来的版本中会去掉。
下面是一个简单的例子。
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)


因为通过shwo warning展示的信息也许包含了特殊的标记关于优化器工作和重写查询的信息,查询语句不一定必须要可用的sql并且也不是必须要可执行。输出的message信息列包含了额外的非sql的解释信息,关于优化器执行计划的。
下面描述了可能出现在show warnings中的特别标记:
<auto_key>:为临时表而自动生成的key
<cache>(expr):表达式被执行一次,而且使用其结果,将结果值保存在内存中。对于结果集由多个值组成的,会生成一个临时表来替代,而且你也会看到<temporary table>
<exists>(query fragment):子查询的判定条件可以转换为EXISTS的判定条件,而且子查询完全可以被转为通过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:查询关联的行在非扩展的EXPLAIN输出,其中一个id的值为N.
outer_tables semi join(inner_tables):一个semi-join操作的inner_tables说明了哪些表没有被检出。具体请看8.2.2.1的优化子查询,派生表和查看关于semi-join事物的引用。
<temporary table>:说明为了存储及时结果集,内部临时表被创建。
如果表的类型是const或者是system,那么对于这些表中列的评估是早于优化器的,并且也不会展示出来。但是如果输出格式为json,const表通过使用const值的引用来展示。
到此关于EXPLAIN的扩展信息就介绍完了。接下来我们看的是8.8.4 Obtaining Execution Plan Information for a Named Connection(以命名连接的形式来获取执行计划的信息)。