SQL中 left join 的底層原理


介紹

left join的實現效果就是保留左表的全部信息,將右表往左表上拼接,如果拼不上則為NULL

除了left join以外,還有inner joinouter joinright join等,文章不介紹其他連接的具體效果,主要講解join的底層原理是如何實現的?具體效果是怎樣呈現的?

只有懂得了底層原理,才能更好的寫出性能優越的SQL腳本,提高SQL的執行速度。

join主要有3種方式,具體為:

  • Nested Loop -- 嵌套循環,細分為以下3種連接方式:
    • Simple Nested-Loop Join
    • Index Nested-Loop Join
    • Block Nested-Loop Join
  • Hash Join
  • Merge Join

其他概念:

驅動表(也叫外表)和被驅動表(也叫非驅動表,還可以叫匹配表,亦可叫內表),簡單來說,驅動表就是主表,left join 中的左表就是驅動表,right join 中的右表是驅動表。

一個是驅動表,那另一個就只能是非驅動表,在 join 的過程中,其實就是從驅動表里面依次(注意理解這里面的依次)取出每一個值,然后去非驅動表里面進行匹配。

Simple Nested-Loop Join

Simple Nested-Loop Join 是這三種方法里面最簡單,最好理解,也是最符合大家認知的一種連接方式。

現在有兩張表 table Atable B,我們讓table A left join table B,觀察是怎樣進行匹配的。

![](https://img2018.cnblogs.com/blog/1401833/201910/1401833-20191001235527140-899479194.jpg)

從驅動表table A依次取出每一個值,然后去非驅動表table B中進行從上往下依次匹配,將值返回。

利用這種方式進行匹配,總共需要執行10×10=100次查詢。

Index Nested-Loop Join

利用索引進行匹配,Index要求非驅動表上具有索引,有了索引以后可以減少匹配次數,提高查詢效率。

數據庫中索引一般采用B+樹的存儲結構,可以提高效率。

如果索引是主鍵的話,效率會更高,因為主鍵必須是唯一的。所以如果被驅動表是用主鍵去連接,只會出現多對一或者一對一的情況,而不會出現多對多和一對多的情況。

Block Nested-Loop Join

理想情況下,用索引匹配是最高效的一種方式,但是在現實工作中,並不是所有的列都是索引列,這個時候就需要用到 Block Nested-Loop Join 方法了,這種方法與第一種方法比較類似,唯一的區別就是會把驅動表中 left join 涉及到的所有列(不止是用來on的列,還有select部分的列)先取出來放到一個緩存區域,然后再去和非驅動表進行匹配,這種方法和第一種方法相比所需要的匹配次數是一樣的,差別就在於驅動表的列數不同,也就是數據量的多少不同。

所以雖然匹配次數沒有減少,但是總體的查詢性能還是有提升的。

參考鏈接:SQL底層原理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM