在開發中常聽到的 left join,inner join ,right join ,cross join 這些連線都是資料庫的邏輯連線,那麼資料庫在執行這些連線的時候,資料庫是如何在底層實現表的關聯的呢?這就是物理連線
目前大部分關係型資料庫支援3種物理連線(mysql 貌似到5.6未知僅支援巢狀連線)
資料庫的物理連線:
資料庫接兩個表時候,會考慮3種方法:巢狀連線,合併連線,雜湊連線。3種方法的連線都有乙個表被選為外表(只掃瞄一次),乙個表被選為內錶(坑內掃瞄多次)。如果查詢連線了多個表,每次查詢只能連線2各表,並儲存把中間結果,使用者連線另外的表。
1、巢狀連線:外表只掃瞄一次,而針對外表的每一行都需要掃瞄一次內錶。(注意:連線不能用long或lob欄位)
2、合併連線:合併連線需要乙個等式連線詞(a.col1=b.col1),還要求根據連線列對兩個連線的表進行排序。合併連線內錶和外表都只掃瞄一次,有時情況下需要再次掃瞄內錶的部分值,例如,外表存在重複值的情況下。所以優化器通常選擇重複值較少的表作為外表。
3、雜湊連線:雜湊連線需要乙個或多個等式連線謂詞,其中每個謂詞的型別相同。char型別長度必須相同。decimal進度必須相同。雜湊連線可以處理多個等式謂詞。對於雜湊連線,首先掃瞄內錶(也稱為構件表 build table),表中的行被複製到記憶體緩衝區。根據「雜湊鍵(hash key)」,這些緩衝區被分為幾個分割槽,如果記憶體中沒有足夠的空間容納整個表,則有些分割槽被寫入磁碟上的臨時表。然後掃瞄外表。然後掃瞄外表(探測表)。對於外表中的每一行,對連線列應用同意雜湊演算法。如果所獲得的雜湊鍵與行的雜湊鍵相匹配,讀取分割槽裡面的所有行並應用連線謂詞。如果與探測錶行匹配的分割槽在記憶體中,則讀取分割槽並應用連線謂詞將立即進行。如果分割槽被寫入臨時表,則探測行也別寫入臨時表。最後,匹配統一分割槽行和對應分割槽被一起處理。
優化器使用3種連線的場景:
巢狀連線:
對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙個表裡面查詢,沒有索引一般就不會是 nested loops。
一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連線欄位要有索引,這樣就走nstedloop。如果驅動表返回記錄太多,就不適合nested loops了。如果連線字段沒有索引,則適合走hash join,因為不需要索引。
inner table被outer table驅動,outer table返回的每一行都要在inner table中檢索到與之匹配的行。
outer table: 小表、驅動表
inner table: 被驅動表、大表
雜湊連線: 雜湊連線是做大資料集連線時的常用方式。優化器掃瞄小表(或資料來源),利用連線鍵(也就是根據連線字段計算hash值)在記憶體中建立hash表,然後掃瞄大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。
當小表可以全部放入記憶體中,其成本接近全表掃瞄兩個表的成本之和。如果表很大不能完全放入記憶體,這時優化器會將它分割成若干不同的分割槽,不能放入記憶體的部分就把該分割槽寫入磁碟的臨時段,此時要有較大的臨時段從而盡量提高i/o 的效能。臨時段中的分割槽都需要換進記憶體做hash join。這時候成本接近於全表掃瞄小表+分割槽數*全表掃瞄大表的代價和。
至於兩個表都進行分割槽,其好處是可以使用parallel query,就是多個程序同時對不同的分割槽進行join,然後再合併。但是複雜。
以下條件下hash join可能有優勢:
兩個巨大的表之間的連線。
在乙個巨大的表和乙個小表之間的連線。
合併連線:
對連線的每個表做table access full;
對table access full的結果按照連線鍵進行排序;
進行merge join對排序結果進行合併。
sort merge join效能開銷幾乎都在前兩步。相較於前兩種連線,合併連線的速度最快的。但也看資料庫的索引和資料量情況。
通常情況下河西連線的效果都比合併連線要好,然而如果行源已經被排過序,在執行合併連線時不需要再排序了,這時合併連線的效能會優於雜湊連線。
在全表掃瞄比索引範圍掃瞄再通過rowid進行表訪問更可取的情況下,合併會比巢狀效能更佳。
各類關係型資料庫都有相應引數可以強制指定那一種連線進行測試。。。
關係型資料庫 非關係型資料庫
關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...
關係型資料庫 非關係型資料庫
2019 02 25 20 38 36 關係型資料庫和非關係型資料的比較 一 關係型資料庫 關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的乙個資料組織 優點 1 易於維護 都是使用表結構,格式一致 2 使用方便 sql語言通用,可用於複雜查詢 3 複雜操作 支援sql,可用於乙個表...
關係型資料庫與非關係型資料庫
關係型資料庫與非關係型資料庫的區別 非關係型資料庫的優勢 1.效能 nosql是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過sql層的解析,所以效能非常高。2.可擴充套件性 同樣也是因為基於鍵值對,資料之間沒有耦合性,所以非常容易水平擴充套件。關係型資料庫的優勢 1.複雜查詢 可...