- inner join 2.left join 左連接配接 3.right join 右連接配接 4.full join 全連接配接 在執行join語句的時候必然要有一個比較的過程,逐條比較兩個表的語句是比較慢的,是以我們可以把兩個表中資料依次讀進一個記憶體塊中, 以MySQL的InnoDB引擎為例,使用以下語句我們必然可以查到相關的記憶體區域show variables like ‘%buffer%’
如圖所示join_buffer_size的大小将會影響我們join語句的執行性能。大部分資料庫中的資料最終要儲存到硬碟上,并且以檔案的形式進行存儲。
以MySQL的InnoDB引擎為例:
*InnoDB以頁(page)為基本的IO機關,每個頁的大小為16KB
*InnoDB會為每個表建立用于存儲資料的.ibd檔案
這意味着我們有多少表要連接配接就需要讀多少個檔案,雖然可以利用索引,但還是免不了頻繁的移動硬碟的磁頭,頻繁的移動磁頭會影響性能。
Join算法
Nested Loop Join
嵌套循環,每次隻讀取表中的一行資料,也就是說如果outerTable有10萬行資料, innerTable有100行資料,需要讀取10000000次(假設這兩個表的檔案沒有被作業系統給緩存到記憶體, 我們稱之為冷資料表)
Block nested loop
Block 塊,也就是說每次都會取一塊資料到記憶體以減少I/O的開銷
當沒有索引可以使用的時候,MySQL InnoDB 就會使用這種算法