暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片
MySQL · 内核特性 · semi-join四个执行strategy.pdf
155
12页
3次
2024-02-22
免费下载
MySQL · 内核特性 · semi-join四个执行strategy
一 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语句或者聚集函数。
二 semi-join的策略
这里以mysql8.0.13为例,讲一下semi-join的几个执行策略:
DuplicateWeedout strategy
使用tmp_table, 按照join order, 选择记录qep_tab table的rowid作为唯一key进行去重,为了更好的理解,举
一个例子:
SQL:
SELECT Country.Name
FROM Country
WHERE Code IN
(SELECT CountryCode
FROM City
WHERE Population > 1M)
Duplicateweedout示意图:
处理过程:
1. 找到duplicate weedout的qep_tab range
/*找到sj的一个tab, 即第一个non-constant table*/
QEP_TAB *const first_sj_tab = qep_array + first_table;
/*这里由于last duplicate weedout table是outer join中的一个inner tables,
这里遍历找到last_sj_tab*/
if (last_sj_tab->first_inner() != NO_PLAN_IDX &&
first_sj_tab->first_inner() != last_sj_tab->first_inner()) {
QEP_TAB *tab2 = &qep_array[last_sj_tab->first_inner()];
while (tab2->first_upper() != NO_PLAN_IDX &&
tab2->first_upper() != first_sj_tab->first_inner())
tab2 = qep_array + tab2->first_upper();
if (qep_array[tab2->first_inner()].last_inner() > last_sj_tab->idx())
last_sj_tab =
&qep_array[qep_array[tab2->first_inner()].last_inner()];
}
of 12
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜