重写非SELECT查询 mysql explain只能解释select查询,并不会对存储程序调用和insert、update、delete或其他语句做解释。然而,你可以重写某些非select查询以利用explain。为了达到这个目的,只需要将该语句转化成一个等价的访问所有相同列的select,任何体积的列都必须在select列表,关联子句,或者where子句中。
UNION
在UNION中的第二个和随后的select被标记为unoin,第一个select被标记就好像它以部分外查询来执行。这就是之前的例子中在union中的第一个select显示为primary的原因。如果union被from子句中的子查询包含,那么它的第一个select会被标记为derived。
UNION RESULT
用来从union的匿名临时表检索结果的select被标记为UNION RESULT。
MySQL 5.6中的改进 mysql5.6中将包含一个对explain的重要改进:能对类似update、insert等的查询进行解释,尽管可以将dml语句转化为等价的“select”查询并explain,但结果并不会完全反映语句是如何执行的,因而这仍然非常有帮助。在开发使用类似Percona Toolkit中的pt-upgrade时曾尝试使用过那个技术,我们不止一次发现,在将查询转化为select时,优化器并不能按我们预期的代码路径执行。因而explain一个查询而不需要转化为select,对我们理解执行过程中到底发生什么,是非常有帮助的。