Semi-join(半连接)
所谓的semi-join就是一个子查询,它主要用于去重,当外表查找在内表满足条件的records时,返回外表的records,也就是说它只返回存在内表中的外表的记录
对应的语法:
SELECT ... From Outer_tables WHERE expr in (SELECT ... From Inner_tables ...) And ...
SELECT ... From Outer_tables WHERE expr exist (SELECT ... From Inner_tables ...) And ...
语法的特征
- semi-join子查询必须EXSIT和IN语句组成的布尔表达式,并且在外层查询的WHERE或者ON子句中出现。
- 外层查询也可以有其他的搜索条件,只不过和IN子查询的搜索条件必须使用AND连接起来。
- semi-join子查询必须是一个单一的查询,不能是由若干查询由UNION连接起来的形式。
- semi-join子查询不能包含GROUP BY或者HAVING语句或者聚集函数。
MySQL支持5中Semi-join策略:
a. DuplicateWeedout
使用临时表对semi-join产生的结果集去重
b. FirstMatch
只选用内部表的第1条与外表匹配的记录
c. LooseScan
把inner-table数据基于索引进行分组,取每组第一条数据进行匹配
d. Materializelookup
将inner-table去重固化成临时表,遍历outer-table,然后在固化表上去寻找匹配
e. MaterializeScan
将inner-table去重固化成临时表,遍历固化表,然后在outer-table上寻找匹配
在MySQL中优化器开关optimizer_switch中,以下参数影响Semi-join的选择
semijoin={on|off}
materialization={on|off}
loosescan={on|off}
subquery_materialization_cost_based={on|off}
总结
在SemiJoin中5种优化策略中,影响策略的最关键的因素:
1、inner-table和outer-table上的数据量。
2、inner-table和outer-table上是否有能快速定位数据的索引。
注意:本文归作者所有,未经作者允许,不得转载