8月 24, 2014 |
Nix.Huang
考虑如下查询:
select * from Country
where Country.code IN (select City.Country
from City
where City.Population > 7*1000*1000)
and Country.continent='Europe'
这个子查询是非相关子查询,我们能和外层循环独立的执行它,materialization的思路正是如此,用大城市的City.country域填充临时表,然后让临时表和欧洲countries执行join操作
这个join 可以通过两个方向完成:
从materialized表到欧洲的国家
从欧洲国家到materialized表
第一种涉及到扫描materialized 表,所以我们叫它“materialized scan”
如果你执行从国家表到materialized表的join,最高效的方式是查找匹配的行通过主键查找,(materialized表有主键,我们用来删除重复),由于此,我们称起为“materialized 查找”
从explain 输出:
我们可以印证我们刚才的描述,先产生临时表,然后临时表和外表执行join操作。由于临时表 的type 是all,那么这是一个“materialized scan”。