MySQL的explain命令有一个extended选项,我想可以很多人都没有注意,因为它对命令的输出结果没有任何改变,只是增加了一个warning。这个warning中显示了MySQL对SQL的解释,从这个解释中我们可以看到SQL的执行方式,对于分析SQL还是很有用的。
比如:
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
*************************** 1. row ***************************
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
<in_optimizer>(`test`.`t`.`a`,
<exists>(select 1 AS `Not_used` from `test`.`i`
where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))
1 row in set (0.00 sec)
在这里MySQL改写了SQL,做了in的优化。