二 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()];
}
评论