hc6538 发表于 2018-10-1 08:04:05

MySQL EXPLAIN extended

  手册上关于EXPLAIN语法的讲解:

12.8.2. EXPLAIN Syntax
  

  
EXPLAIN SELECT select_options
  

  

  Or:
  

  
EXPLAIN tbl_name
  

  

  The EXPLAIN statement can be used       either as a way to obtain information about how MySQL executes a       SELECT statement or as a synonym       for DESCRIBE:


[*]  When you precede a SELECT         statement with the keyword         EXPLAIN, MySQL displays         information from the optimizer about the query execution plan.         That is, MySQL explains how it would process the         SELECT, including information         about how tables are joined and in which order.         EXPLAIN         EXTENDED can be used to provide additional         information.
  For information on how to use         EXPLAIN and         EXPLAIN         EXTENDED to obtain query execution plan information,         see Section 7.2.1, “Optimizing Queries with EXPLAIN”.

[*]  EXPLAIN         tbl_name is synonymous         with DESCRIBE         tbl_name or SHOW         COLUMNS FROM tbl_name.
  For a description of the         DESCRIBE and         SHOW COLUMNS statements, see         Section 12.8.1, “DESCRIBE Syntax”, and         Section 12.4.5.5, “SHOW COLUMNS Syntax”.

  -------------------
  以下的文章主要讲述的是MYSQL EXPLAIN语句中的extended 选项的实际应用与具体的操作步骤,我们大家都了解MySQL数据库中有一个explain 命令,其主要功能是用来分析select语句的运行效果,例如explain可以获得select语句。
  使用的索引情况、排序的情况等等。除此以外,explain 的extended 扩展能够在原本explain的基础
  上额外的提供一些查询优化的信息,这些信息可以通过MySQL的show warnings命令得到。下面是一个最简单的例子。
  首先执行对想要分析的语句进行MySQL explain,并带上extended选项
  


[*]MySQL> explain extended select * from account\G;
  

  


[*]id: 1
[*]select_type: SIMPLE
[*]table: account
[*]type: ALL
[*]possible_keys: NULL
[*]key: NULL
[*]key_len: NULL
[*]ref: NULL
[*]rows: 1
[*]filtered: 100.00
[*]Extra:
[*]1 row in set, 1 warning (0.00 sec)
  

  接下来再执行Show Warnings
  


[*]MySQL> show warnings\G;
  

  


[*]Code: 1003
[*]Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
[*]1 row in set (0.00 sec)
  

  从 show warnings的输出结果中我们可以看到原本的select * 被MySQL优化成了
  


[*]select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
  

  explain extended 除了能够告诉我们MySQL的查询优化能做什么,同时也能告诉我们MySQL的查询优化做不了什么。MySQL performance的Extended EXPLAIN这篇文中中作者就利用explain extended +show warnings 找到了MySQL查询优化器中不能查询优化的地方。
  从
  


[*]EXPLAIN extended SELECT * FROM sbtest WHERE id>5 AND id>6 AND c=”a” AND pad=c
  


  语句的输出我们得知MySQL的查询优化器不能将id>5 和>  在MySQL performance的explain extended文章中第三个例子和静室的MySQL explain的extended选项文章中,
  两位作者也对explain extended做了进一步的实验,从这个两篇文中中我们可以得出结论是从
  explain extend的输出中,我们可以看到sql的执行方式,对于分析sql还是很有帮助的。
  下面特别摘抄了静室的explain的extended选项这篇文章中的内容
  以下代码和分析摘抄至静室的explain的extended选项
  


[*]MySQL>explain extended select * from t where a in (select b from i);
[*]+—-+——————–+——-+——+
[*]| id | select_type | table | type |
[*]+—-+——————–+——-+——+
[*]| 1 | PRIMARY | t | ALL |
[*]| 2 | DEPENDENT SUBQUERY | i | ALL |
[*]+—-+——————–+——-+——+
[*]2 rows in set, 1 warning (0.01 sec)
  

  子查询看起来和外部的查询没有任何关系,为什么MySQL显示的是DEPENDENT SUBQUERY,
  和外部相关的查询呢?从explain extended的结果我们就可以看出原因了。
  


[*]MySQL>show warnings\G
  

  


[*]Level: Note
[*]Code: 1003
[*]Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`
[*]from `test`.`t` where
[*](`test`.`t`.`a`,
[*](select 1 AS `Not_used` from `test`.`i`
[*]where ((`test`.`t`.`a`) = `test`.`i`.`b`)))
[*]1 row in set (0.00 sec)
  

  在这里MySQL改写了SQL,做了in的优化。
  以上代码和分析摘抄至静室的explain的extended选项
  不过需要注意的一点是从EXPLAIN extended + show warnings得到“优化以后”的查询语句
  可能还不是最终优化执行的sql,或者说MySQL explain extended看到的信息还不足以说明MySQL最
  终对查询语句优化的结果。同样还是MySQL formance的explain Extended这篇文章的第二个
  例子就说明了这种情况
  


[*]MySQL> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5
[*]AND t2.k=t1.k;
[*]+—-+————-+——-+——-+—————+———+———+——-+——-+——-+
[*]| id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
[*]+—-+————-+——-+——-+—————+———+———+——-+——-+——-+
[*]| 1 | SIMPLE | t1 | const | PRIMARY,k | PRIMARY | 4 | const | 1 | |
[*]| 1 | SIMPLE | t2 | ref | k | k | 4 | const | 55561 | |
[*]+—-+————-+——-+——-+—————+———+———+——-+——-+——-+
[*]2 rows IN SET, 1 warning (0.00 sec)
[*]MySQL> SHOW warnings \G
  

  1. row Level: Note
  


[*]Code: 1003
[*]Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`
[*]JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
[*]1 row IN SET (0.00 sec)
  

  从Explain的结果中我们可以得到t1表的查询使用的是”const”类型,也就是说MySQL查询的时候
  会先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查询数据,很显然这样的查询优化结果没有在
  接下来的Show Warings输出中找到。
  总结
  还是引用静室 在explain的 extended选项这篇文章中的几句话”从MySQL explain extend的输出中,我们可以看到sql的执行方式,对于分析sql还是很有帮助的”。
  转载自: http://database.51cto.com/art/201005/201354.htm


页: [1]
查看完整版本: MySQL EXPLAIN extended