連接過程
每獲得一條驅動表記錄,就立即到被驅動表尋找匹配的記錄。
對于兩表連接來說,驅動表只會被訪問一遍,但被驅動表卻要被訪問好多遍;具體訪問幾遍取決于對驅動表執行單表查詢后的結果集中有多少條記錄。
? 對于內連接來說,選取哪個表為驅動表都沒關系。
? 而外連接的驅動表是固定的,也就是說左(外)連接的驅動表就是左邊的那個表,右(外)連接的驅動表就是右邊的那個表。
連接原理
嵌套循環連接
連接步驟:
? 步驟1 :選取驅動表,使用與驅動表相關的過濾條件,選取代價最低的單表訪問方法來執行對驅動表的單表查詢.
? 步驟2:對步驟 1中查詢驅動表得到的結果集中的每一條記錄,都分別到被驅動表中查找匹配的記錄(先通過“涉及兩表的過濾條件”匹配,再進行“只涉及被驅動表的過濾條件”進行過濾)。
? 由于被驅動表可能會訪問多次,因此可以為被驅動表建立合適的索引以加快查詢速度。
? 如果驅動表非常大,則可能會多次訪問被驅動表,就會導致很多次的磁盤I/O,此時可以使用基于塊的嵌套循環連接算法來緩解由此造成的性能損耗。
優化:基于塊的嵌套循環連續
join Buffer (連接緩沖區〉
? Join Buffer 就是在執行連接查詢前申請的一塊固定大小的內存。先把若干條驅動表結果集中的記錄裝在這個 Join Buffer 中,然后開始掃描被驅動表,每條被驅動表的記錄一次性地與 Join Buffer 中的多條驅動表記錄進行匹配。由于匹配的過程都是在內存中完成的,所以這樣可以顯著減少被驅動表的I/O代價.
? 最好的情況是 Join Buffer 夠大 能容納驅動表結果集中的所有記錄,這樣只需要訪問一次被驅動表就可以完成連接操作了。
? 由join buffe _size配置。