考虑如下查询:
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 scan”
如果你执行从国家表到materialized表的join,最高效的方式是查找匹配的行通过主键查找,(materialized表有主键,我们用来删除重复),由于此,我们称起为“materialized 查找”
从explain 输出:
我们可以印证我们刚才的描述,先产生临时表,然后临时表和外表执行join操作。由于临时表<subquery2> 的type 是all,那么这是一个“materialized scan”。
Posted in: MySQL practise | Tags: materialization strategy, MySQL 5.6, optimize, Semi Join
Comments are closed.