連接就是把各個表中的記錄都拿出來然后依次匹配加入到結果集中。連接查詢中表A與表B連接查詢,表A的每條記錄和表B的每條記錄相互匹配的組成結果集被稱為笛卡爾積。
-
連接查詢過程
- 確定第一個表為驅動表,查詢出驅動表中所有符合條件的結果集A
- 根據上一步查詢出的結果集A,循環查詢第二個表(被驅動表)與結果集A匹配的記錄。比如結果集A找出3條符合的記錄,那么被驅動表也要根據這些過濾條件查詢3次表。
-
連接分類
-
內連接:(表A inner join/cross join/join/,表B,左右表位置隨意互換)驅動表中的記錄在被驅動表中找不到匹配記錄,該記錄不加入到結果集中。
-
外連接:驅動表中的記錄即使在被驅動表中沒有匹配的記錄,也仍要加入到結果集中
-
左連接:(表A left join 表B on 條件)左側表表A為驅動表
-
右連接:(表A right join 表B on 條件)右側表表B為驅動表
-
但是使用外連接時不想把不匹配的空記錄放到結果集中,可以更改篩選條件子句的使用方式達成。
- where:不論內外連接,不符合條件的都不會被加入到結果集中
- on:如果無法在被驅動表中找到過濾條件的記錄,對應的被驅動表記錄的列置為null放入到結果集中
-
-
連接原理
- 嵌套循環連接
- 步驟1:選取驅動表,使用與驅動表相關的過濾條件,選取代價最低的單表訪問方法來執行對驅動表的單表查詢。
- 步驟2:對上一步驟中查詢驅動表得到的結果集中每一條記錄,都分別到被驅動表中查找匹配的記錄。
- 索引加快連接速度
被驅動表使用到的搜索條件列置為索引列,二級索引+回表的代價低於全表掃描更低時才會使用索引;
-
基於塊的嵌套循環連接
- 將表從磁盤加載到內存中,如果內存不足會先加載部分,等到加載到后面的記錄時釋放前面的記錄
- join buffer(默認256kb,join_buffer_size配置):執行查詢前申請一塊固定大小的內存,然后把驅動表查出的結果集(只放入查詢列和條件列,所以盡量不要*查詢)記錄裝在里面,每條被驅動表的記錄一次性和join buffer中的多條驅動表記錄做匹配,做完匹配后的一條記錄會從內存中清除。
-
連接優化
以上三種連接方法,最優是給被驅動表加上效率高的索引,其次是為機器調大join_buffer_size,只能選用一種。