IIWAB MySQL--Semi-join(半连接)优化策略 - IIWAB

MySQL--Semi-join(半连接)优化策略

IIWAB 1年前 ⋅ 477 阅读

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 ...

语法的特征

  1. semi-join子查询必须EXSIT和IN语句组成的布尔表达式,并且在外层查询的WHERE或者ON子句中出现。
  2. 外层查询也可以有其他的搜索条件,只不过和IN子查询的搜索条件必须使用AND连接起来。
  3. semi-join子查询必须是一个单一的查询,不能是由若干查询由UNION连接起来的形式。
  4. 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上是否有能快速定位数据的索引。


全部评论: 0

    我有话说: