共計 2187 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇“MySQL 左連接、右連接、內連接與 Hash 連接怎么實現”文章的知識點大部分人都不太理解,所以丸趣 TV 小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL 左連接、右連接、內連接與 Hash 連接怎么實現”文章吧。
一、MySQL 數據庫 JOIN 連接
在多個表上創建索,并且多個表 JOIN 和子查詢語句相對比較困難。許多開發人員不自覺地認為 JOIN 會降低 SQL 的性能效率,因此他們將多表 SQL 拆分為單表查詢,認為這會影響 SQL 執行的效率,原因是開發人員不了解 JOIN 實現過程。
聯接之間的表關聯使用索引進行匹配,假設表 R 和表 S 是連接的。
表 R 被稱為驅動表,表 R 中通過 WHERE 條件過濾的數據將在表 S 對應的索引上逐個查詢。如果驅動表 R 的數據量不大,則上述算法非常有效。
以下三種 JOIN 類型,驅動表各是哪張表:
SELECT * FROM R LEFT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R INNER JOIN S ON R.x = S.x WEHRE ...
1、inner join
對于 INNER JOIN,驅動表可能是表 R,也可能是表 S。顯示左邊右邊共有的數據。
在這種場景下,誰需要查詢的數據量越少,誰就是驅動表。我們來看下面的例子
SELECT * FROM R INNER JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
2、LEFT JOIN
上述 Left Join 來說,驅動表就是左表 R;Right Join 中,驅動表就是右表 S。這是 JOIN 類型決定左表或右表的數據一定要進行查詢。
返回包括左表中的所有記錄和右表中聯結字段相等的記錄。即使右表中沒有匹配,也從左表返回所有的行。
SELECT * FROM R LEFT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
3、RIGHT JOIN
上述 Left Join 來說,驅動表就是左表 R;Right Join 中,驅動表就是右表 S。這是 JOIN 類型決定左表或右表的數據一定要進行查詢。
返回包括右表中的所有記錄和左表中聯結字段相等的記錄。即使左表中沒有匹配,也從右表返回所有的行。
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
二、MySQL 數據庫 Hash Join1、什么是 Hash Join
MySQL 中的第二個 JOIN 是 Hash JOIN,當兩個表之間的連接條件沒有索引時使用該算法。
如果沒有連接,那么創建索引可以嗎?
如果某些列是選擇性低的索引,則在創建索引以導入數據時必須對數據進行排序,這會影響導入性能;輔助索引將出現返回表的問題。如果過濾的數據量很大,直接全表掃描會更快。
對于 OLAP 業務查詢(OLAP 是在線分析處理,用于數據分析,它使我們能夠同時分析來自多個數據庫系統的信息),哈希連接是一個必不可少的功能。MySQL 8.0 開始支持 Hash Join 算法,加強了對 OLAP 業務的支持。
因此,如果您的查詢數據量不太大,并且查詢的響應時間要求在分鐘級別,則可以使用單實例 MySQL 8.0 來完成大數據的查詢。
2、Hash JOIN 工作原理
Hash JOIN 出現在 MySQL 8.0 的執行計劃中,Hash JOIN 掃描關聯的兩個表:首先,在掃描驅動器表的過程中創建一個哈希表;當掃描第二個表時,將在哈希表中搜索每個關聯記錄。如果找到,將返回記錄。
哈希連接選擇驅動程序表和嵌套循環連接算法,兩者基本相同。兩個較小的表都用作驅動程序表. 如果驅動器表很大,并且創建的哈希表超過了內存大小,MySQL 將自動將結果轉儲到磁盤。
三、子查詢
子查詢的邏輯非常清晰。雖然 JOIN 也可以滿足需求,但這并不容易理解,因為 LEFT JOIN 是一種代數關系,子查詢更傾向于從人類思維的角度來理解。
然而,在 MySQL 8.0 中,優化器會自動將 in 子查詢優化為 JOIN 執行計劃,這將顯著提高性能。
我們只需要關注 SQL 執行計劃,如果兩個執行計劃相同,則性能沒有差異。
在 MySQL 8.0 之前,MySQL 沒有完全優化子查詢。因此,您將在子查詢的執行計劃中看到 DEPENDENT SUBQUERY 的提示,這表明它是一個從屬子查詢,子查詢需要依賴外部表的關聯。DEPENDENT SUBQUERY 的執行速度可能非常慢,而且大多數時候您需要手動將其轉換為兩個表之間的連接。
所以這里提示大家,如果你的當前的 MySQL 8.0 版本可以編寫子查詢,因為子查詢的優化相當完整;
對于 MySQL 8.0 之前版本的 MySQL,需要查看所有子查詢的 SQL 執行計劃。對于 DEPENDENT SUBQUERY 的提示,要進行優化,否則將對業務產生重大性能影響;DEPENDENT SUBQUERY 的優化通常被重寫為用于表連接的派生表。
以上就是關于“MySQL 左連接、右連接、內連接與 Hash 連接怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望丸趣 TV 小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注丸趣 TV 行業資訊頻道。