背 景
MySQL引入了Materialization(物化)这一关键特性用于子查询(比如在IN/NOTIN子查询以及 FROM子查询)优化,其关键点在于对子查询只需要执行一次。具体实现方式为:
在SQL执行过程中,第一次需要子查询结果时执行子查询并将子查询的结果保存为临时表。
后续对子查询结果集的访问将直接通过临时表获得。
与之相对的执行方式是对外表的每一行都对子查询进行调用,其执行计划中的查询类型为“DEPENDENTSUBQUERY”。虽然物化子查询有利于提高SQL的执行效率,但如果使用不当,会引起意想不到的后果,比如数据库宕机,今天所讲的案例就是这样一个场景。
案例分析
一MySQL-5.7.17测试环境,业务发出一条查询sql语句后,直接引起数据库的宕机,查看err日志,发现sql语句如下:
问题sql为包括两个子查询的多表关联select语句。
分析执行计划
执行计划相对简单,值得注意的是select_type为“SUBQUERY”,它表明该sql可能使用了物化子查询功能,为了得到确切