JOIN 原理

JOIN算法:

Simple Nested-Loop Join

循環(huán)從驅(qū)動(dòng)表r中取出一行并與被驅(qū)動(dòng)表s進(jìn)行匹配,mysql沒(méi)有使用這種算法。


image.png

Index Nested-Loop Join

索引嵌套

select * from t1 join t2 on (t1.a=t2.a);

t2的a字段有索引
1.從表 t1 中讀入一行數(shù)據(jù) R;
2.從數(shù)據(jù)行 R 中,取出 a 字段到表 t2 里去查找;
3.取出表 t2 中滿足條件的行,跟 R 組成一行,作為結(jié)果集的一部分;
4.重復(fù)執(zhí)行步驟 1 到 3,直到表 t1 的末尾循環(huán)結(jié)束。

這里可以看出,驅(qū)動(dòng)表t1要做全表掃描,被驅(qū)動(dòng)表使用索引并且小表來(lái)做驅(qū)動(dòng)表。

Block Nested-Loop Join

如果被驅(qū)動(dòng)表上沒(méi)有索引的話,

1.把表 t1 的數(shù)據(jù)讀入線程內(nèi)存 join_buffer 中,由于我們這個(gè)語(yǔ)句中寫(xiě)的是 select *,因此是把整個(gè)表 t1 放入了內(nèi)存;
2.掃描表 t2,把表 t2 中的每一行取出來(lái),跟 join_buffer 中的數(shù)據(jù)做對(duì)比,滿足 join 條件的,作為結(jié)果集的一部分返回。


image.png

這個(gè)算法與Simple Nested-Loop Join的區(qū)別在于,他的比較過(guò)程實(shí)在內(nèi)存中完成的,而不需要每次比較都進(jìn)行一次磁盤(pán)IO操作。
如果join buffer不能放下所有的驅(qū)動(dòng)表,則分段放入join buffer,但其實(shí)最后比較次數(shù)是沒(méi)有變的。
這里也需要小表驅(qū)動(dòng)大表,因?yàn)榭梢詼p少分段次數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容