多表連接的原理


連接就是把各個表中的記錄都拿出來然后依次匹配加入到結果集中。連接查詢中表A與表B連接查詢,表A的每條記錄和表B的每條記錄相互匹配的組成結果集被稱為笛卡爾積。

  1. 連接查詢過程

  • 確定第一個表為驅動表,查詢出驅動表中所有符合條件的結果集A
  • 根據上一步查詢出的結果集A,循環查詢第二個表(被驅動表)與結果集A匹配的記錄。比如結果集A找出3條符合的記錄,那么被驅動表也要根據這些過濾條件查詢3次表。
  1. 連接分類

  • 內連接:(表A inner join/cross join/join/,表B,左右表位置隨意互換)驅動表中的記錄在被驅動表中找不到匹配記錄,該記錄不加入到結果集中。

  • 外連接:驅動表中的記錄即使在被驅動表中沒有匹配的記錄,也仍要加入到結果集中

    • 左連接:(表A left join 表B on 條件)左側表表A為驅動表

    • 右連接:(表A right join 表B on 條件)右側表表B為驅動表

    • 但是使用外連接時不想把不匹配的空記錄放到結果集中,可以更改篩選條件子句的使用方式達成。

      • where:不論內外連接,不符合條件的都不會被加入到結果集中
      • on:如果無法在被驅動表中找到過濾條件的記錄,對應的被驅動表記錄的列置為null放入到結果集中
  1. 連接原理

  • 嵌套循環連接
  • 步驟1:選取驅動表,使用與驅動表相關的過濾條件,選取代價最低的單表訪問方法來執行對驅動表的單表查詢。
  • 步驟2:對上一步驟中查詢驅動表得到的結果集中每一條記錄,都分別到被驅動表中查找匹配的記錄。
  • 索引加快連接速度

被驅動表使用到的搜索條件列置為索引列,二級索引+回表的代價低於全表掃描更低時才會使用索引;

  • 基於塊的嵌套循環連接

    • 將表從磁盤加載到內存中,如果內存不足會先加載部分,等到加載到后面的記錄時釋放前面的記錄
    • join buffer(默認256kb,join_buffer_size配置):執行查詢前申請一塊固定大小的內存,然后把驅動表查出的結果集(只放入查詢列和條件列,所以盡量不要*查詢)記錄裝在里面,每條被驅動表的記錄一次性和join buffer中的多條驅動表記錄做匹配,做完匹配后的一條記錄會從內存中清除。
  1. 連接優化

以上三種連接方法,最優是給被驅動表加上效率高的索引,其次是為機器調大join_buffer_size,只能選用一種。


免責聲明!

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



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