join原理

join 主要有Nested Loop、Hash Join、Merge Join這三種方式,

Nested Loop 翻譯過來就是嵌套循環(huán)的意思,那什么又是嵌套循環(huán)呢?嵌套大家應(yīng)該都能理解,就是一層套一層;那循環(huán)呢,你可以理解成是 for 循環(huán)。

Nested Loop 里面又有三種細(xì)分的連接方式,分別是Simple Nested-Loop Join、Index Nested-Loop Join、Block Nested-Loop Join,接下來我們就分別去看一下這三種細(xì)分的連接方式。

在正式開始之前,先介紹兩個(gè)概念,驅(qū)動(dòng)表(也叫外表)和被驅(qū)動(dòng)表(也叫非驅(qū)動(dòng)表,還可以叫匹配表,亦可叫內(nèi)表),簡單來說,驅(qū)動(dòng)表就是主表,left join 中的左表就是驅(qū)動(dòng)表,right join 中的右表是驅(qū)動(dòng)表。一個(gè)是驅(qū)動(dòng)表,那另一個(gè)就只能是非驅(qū)動(dòng)表了,在 join 的過程中,其實(shí)就是從驅(qū)動(dòng)表里面依次(注意理解這里面的依次)取出每一個(gè)值,然后去非驅(qū)動(dòng)表里面進(jìn)行匹配,那具體是怎么匹配的呢?這就是我們接下來講的這三種連接方式。


Simple Nested-Loop Join

?left join 會(huì)從驅(qū)動(dòng)表 table A 中依次取出每一個(gè)值,然后去非驅(qū)動(dòng)表 table B 中從上往下依次匹配,然后把匹配到的值進(jìn)行返回,最后把所有返回值進(jìn)行合并,這樣我們就查找到了table A left join table B的結(jié)果。是不是和你的認(rèn)知是一樣的呢?利用這種方法,如果 table A 有10行,table B 有10行,總共需要執(zhí)行10 x 10 = 100次查詢。

Index Nested-Loop Join

Index Nested-Loop Join 這種方法中,我們看到了 Index,大家應(yīng)該都知道這個(gè)就是索引的意思,這個(gè) Index 是要求非驅(qū)動(dòng)表上要有索引,有了索引以后可以減少匹配次數(shù),匹配次數(shù)減少了就可以提高查詢的效率了。

Block Nested-Loop Join

理想情況下,用索引匹配是最高效的一種方式,但是在現(xiàn)實(shí)工作中,并不是所有的列都是索引列,這個(gè)時(shí)候就需要用到 Block Nested-Loop Join 方法了,這種方法與第一種方法比較類似,唯一的區(qū)別就是會(huì)把驅(qū)動(dòng)表中 left join 涉及到的所有列(不止是用來on的列,還有select部分的列)先取出來放到一個(gè)緩存區(qū)域,然后再去和非驅(qū)動(dòng)表進(jìn)行匹配,這種方法和第一種方法相比所需要的匹配次數(shù)是一樣的,差別就在于驅(qū)動(dòng)表的列數(shù)不同,也就是數(shù)據(jù)量的多少不同。所以雖然匹配次數(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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