Join的類型
![MySQL Join使用原理是什麼](https://img.php.cn/upload/article/000/000/164/168506684134897.png)
![MySQL Join使用原理是什麼](https://img.php.cn/upload/article/000/000/164/168506684138948.png)
![MySQL Join使用原理是什麼](https://img.php.cn/upload/article/000/000/164/168506684155380.png)
![MySQL Join使用原理是什麼](https://img.php.cn/upload/article/000/000/164/168506684224869.png)
#cross join 笛卡爾積
-
如果不使用where條件則結果集為兩個關聯表行的乘積
與,的區別為,
cross join建立結果集時會根據on條件篩選結果集合
-
#straight_join
-
嚴格依照SQL順序指定磁碟機表,
左表是驅動
Join原理這句話可以這樣重寫:可以將其本質理解為嵌套循環的運算,其中外層for迴圈驅動表,而內層for迴圈則是被驅動表。根據連接組成資料的策略可以分為三種演算法。
- Simpe Nested-Loop Join
連接例如有A表,B表,兩個表JOIN的話會拿著A表的連表條件一條一條在B表循環,匹配A表和B表相同的id 放入結果集,這種效率是最低的。
- Index Nested-Loop Join
#執行流程(磁碟掃描)
-
從表t1中讀入一行資料R;
- 從資料行R中,取出a欄位到表t2裡進行
樹搜尋查找;
取出表t2中滿足條件的行,跟R組成一行,作為結果集的一部分;
重複執行步驟1到3,直到表t1的末尾循環結束。
- 而對於每一行R,根據a字段去表t2查找,走的是樹搜尋過程。
- Block Nested-Loop Join
- #mysql使用了一個叫
join buffe
r的緩衝區去減少循環次數,這個緩衝區預設是256KB,可以透過指令show variables like 'join_%'查看
-
其具體的做法是,將第一個表中符合條件的資料列一次查詢到緩衝區中,然後遍歷一次第二個表,並逐一和緩衝區的所有值比較,將比較結果加入結果集中
#########只有當JOIN類型為ALL, index,rang或是index_merge的時候才會使用join buffer,可以透過explain查看SQL的查詢類型。 ###############Join最佳化############為了最佳化join演算法採用Index nested-loop join演算法,在連線欄位上建立索引欄位## ##########使用資料量小的表去驅動資料量大的表#############增加join buffer size的大小(一次快取的資料越多,那麼外層表格循環的次數就越少)############注意連接欄位的隱含轉換與字元編碼,避免索引失效#########
以上是MySQL Join使用原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!