mysql中semi-join的优化策略介绍

1. 背景介绍
什么是semi-join?
所谓的semi-join是指semi-join子查询。 该子查询具有如下结构:
SELECT ... FROM outer_tables WHERE expr IN (SELECT ... FROM inner_tables ...) AND ...
即在where条件的“IN”中的那个子查询。
这种查询的特点是我们只关心outer_table中与semi-join相匹配的记录。
换句话说,最后的结果集是在outer_tables中的,而semi-join的作用只是对outer_tables中的记录进行筛选。这也是我们进行semi-join优化的基础,即我们只需要从semi-join中获取到最少量的足以对outer_tables记录进行筛选的信息就足够了。
所谓的最少量,体现到优化策略上就是如何去重
以如下语句为例:
select * from Country 
where Country.Code in 
(select City.country from City where City.Population>1*1000*1000);
当中的semi-join: “
select City.country from City where City.Population>1*1000*1000
” 可能返回的结果集如下: China(Beijin), China(Shanghai), France(Paris)...
我们可以看到这里有2个China,分别来至2条城市记录Beijin和Shanghai, 但实际上我们只需要1个China就足够对outer_table  Country进行筛选了。所以我们需要去重。

2. Mysql支持的Semi-join策略
Mysql支持的semi-join策略主要有5个,它们分别为:
1. DuplicateWeedout: 使用临时表对semi-join产生的结果集去重。
mysql中semi-join的优化策略介绍
对应的匹配条件为:
mysql中semi-join的优化策略介绍

2. FirstMatch: 只选用内部表的第1条与外表匹配的记录。
mysql中semi-join的优化策略介绍
对应的匹配条件为:
mysql中semi-join的优化策略介绍


3. LooseScan: 把inner-table数据基于索引进行分组,取每组第一条数据进行匹配。
mysql中semi-join的优化策略介绍
对应的匹配条件为:
mysql中semi-join的优化策略介绍



4. Materializelookup: 将inner-table去重固化成临时表,遍历outer-table,然后在固化表上去寻找匹配。
对应的匹配条件:
mysql中semi-join的优化策略介绍


5. MaterializeScan: 将inner-table去重固化成临时表,遍历固化表,然后在outer-table上寻找匹配。
mysql中semi-join的优化策略介绍
对应的条件:
mysql中semi-join的优化策略介绍


参考:
1.mysql代码 (sql/sql_select.cc 的setup_semijoin_dups_elimination函数)

2.askmonty的knowledgebase

from : http://blog.sina.com.cn/s/blog_4673e60301011qvx.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值