15.查询优化和子查询半查询(gold_axe)
类型按结果划分:
根据与外层的关系:
SELECT * FROM s 1 WHERE key 1 IN(SELECT common _ field FROM S2 WHERE key 3 = ' a ');
SELECT * FROM s 1 WHERE key 1
从s2中选择common_field,其中key3 = 'a '
这两个表是S1S2,是不相关的查询。
内层查询的结果集太多,可能内存放不下,in(太多)效率太低。
所以内层查询的结果会被放入临时表中,这个过程会不断重复(瘦身),这就是所谓的物化。
选择s1。* FROM s 1 SEMI JOIN S2 ON s 1 . key 1 = S2 . common _ field其中key3 = ' a
这个声明不能执行,只是一个标志。
半连接:只关心s2表中是否有匹配的记录,不关心有多少条记录匹配。
如何通过执行半连接来消除重复值:
如果IN子查询不满足转换为半连接的条件,并且不能转换为物化表或者转换为物化表的代价太高,那么它将被转换为EXISTS查询。