MySQL对子查询的支持比那些套了个简单SQL壳的K/V系统要好得多,但是它基本上还是以迭代的方式来处理相关子查询。
---MySQL等数据库,把可优化的子查询上拉(即扁平化)为连接或半连接操作。
---子查询的消除,主要使用的是逻辑优化的方式;逻辑优化,使用关系代数+启发式规则,对SQL进行等价变换,这个过程,非迭代。MySQL原理如此,其他数据库原理也如此。
---而所谓“迭代”,是执行器对子查询的实现方式,即不可被优化的子查询,其执行过程,通常是迭代处理。但进入执行阶段,优化过程已经结束了。
select * from t1 where c1 = (select max(d1) from t2 where t1.c2 = t2.d2);
---这个例子见了好多次了,感兴趣的网友可搜索一下。
---所用示例,可能是DM的典型用例,能体现其长处,所以被反复使用。
--- 2014年3月曾引用+讨论过这样的例子,参见:http://blog.163.com/li_hx/blog/static/18399141320142239359546/
---还是个特例?
本文探讨了MySQL中子查询的处理方式及其优化策略,包括通过逻辑优化将子查询转化为连接操作,以及不可优化子查询的迭代处理方式。
183

被折叠的 条评论
为什么被折叠?



