MySQL 5.6 Semi join优化之materialization strategy

8月 24, 2014 |

考虑如下查询:

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操作

materialized-1

 

 

 

 

 

 

 

这个join 可以通过两个方向完成:

  1. 从materialized表到欧洲的国家
  2. 从欧洲国家到materialized表

第一种涉及到扫描materialized 表,所以我们叫它“materialized scan”

如果你执行从国家表到materialized表的join,最高效的方式是查找匹配的行通过主键查找,(materialized表有主键,我们用来删除重复),由于此,我们称起为“materialized 查找”

从explain 输出:

materialized-2

 

 

 

 

 

我们可以印证我们刚才的描述,先产生临时表,然后临时表和外表执行join操作。由于临时表<subquery2> 的type 是all,那么这是一个“materialized scan”。

 

https://mariadb.com/kb/en/mariadb/mariadb-documentation/optimization-and-tuning/query-optimizations/optimization-strategies/semi-join-materialization-strategy/

Posted in: MySQL practise | Tags: , , ,

Comments are closed.