??作者簡介:小明java問道之路,專注于研究 Java/ Liunx內(nèi)核/ C++及匯編/計算機(jī)底層原理/源碼,就職于大型金融公司后端高級工程師,擅長交易領(lǐng)域的高安全/可用/并發(fā)/性能的架構(gòu)設(shè)計與演進(jìn)、系統(tǒng)優(yōu)化與穩(wěn)定性建設(shè)。
??
?? 熱衷分享,喜歡原創(chuàng)~ 關(guān)注我會給你帶來一些不一樣的認(rèn)知和成長。
?? InfoQ簽約作者、CSDN專家博主/后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者/內(nèi)容合伙人、阿里云專家/簽約博主、51CTO專家 ??
??如果此文還不錯的話,還請??關(guān)注、點(diǎn)贊、收藏三連支持??一下博主~?
本文目錄
本文目錄
本文導(dǎo)讀
一、MySQL數(shù)據(jù)庫JOIN連接
1、inner join
2、LEFT JOIN
3、RIGHT JOIN
二、MySQL數(shù)據(jù)庫Hash Join
1、什么是?Hash Join
2、Hash JOIN 工作原理
三、子查詢
總結(jié)
本文導(dǎo)讀
本文介紹MySQL數(shù)據(jù)庫中的左連接、右連接、內(nèi)連接與Hash連接的工作原理,并分析子查詢與 JOIN 的不同,根據(jù)本文所學(xué)提供一些工作中需要掌握的實戰(zhàn)技巧。文章來源地址http://www.zghlxwxcb.cn/news/detail-781203.html
一、MySQL數(shù)據(jù)庫JOIN連接
在多個表上創(chuàng)建索,并且多個表JOIN和子查詢語句相對比較困難。許多開發(fā)人員不自覺地認(rèn)為JOIN 會降低 SQL 的性能效率,因此他們將多表 SQL 拆分為單表查詢,認(rèn)為這會影響SQL執(zhí)行的效率,原因是開發(fā)人員不了解JOIN實現(xiàn)過程。
聯(lián)接之間的表關(guān)聯(lián)使用索引進(jìn)行匹配,假設(shè)表R和表S是連接的。
表R被稱為驅(qū)動表,表R中通過WHERE條件過濾的數(shù)據(jù)將在表S對應(yīng)的索引上逐個查詢。如果驅(qū)動表R的數(shù)據(jù)量不大,則上述算法非常有效。
以下三種 JOIN 類型,驅(qū)動表各是哪張表:
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,驅(qū)動表可能是表 R,也可能是表 S。顯示左邊右邊共有的數(shù)據(jù)。
在這種場景下,誰需要查詢的數(shù)據(jù)量越少,誰就是驅(qū)動表。 我們來看下面的例子
SELECT * FROM R INNER JOIN S? ON R.x = S.x? WHERE R.y = ? AND S.z = ?
2、LEFT JOIN
上述 Left Join 來說,驅(qū)動表就是左表 R;Right Join中,驅(qū)動表就是右表 S。這是 JOIN 類型決定左表或右表的數(shù)據(jù)一定要進(jìn)行查詢。
返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄。即使右表中沒有匹配,也從左表返回所有的行。
SELECT * FROM R LEFT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
3、RIGHT JOIN
上述 Left Join 來說,驅(qū)動表就是左表 R;Right Join中,驅(qū)動表就是右表 S。這是 JOIN 類型決定左表或右表的數(shù)據(jù)一定要進(jìn)行查詢。
返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄。即使左表中沒有匹配,也從右表返回所有的行。
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
二、MySQL數(shù)據(jù)庫Hash Join
1、什么是?Hash Join
MySQL中的第二個 JOIN 是 Hash JOIN,當(dāng)兩個表之間的連接條件沒有索引時使用該算法。
如果沒有連接,那么創(chuàng)建索引可以嗎?
如果某些列是選擇性低的索引,則在創(chuàng)建索引以導(dǎo)入數(shù)據(jù)時必須對數(shù)據(jù)進(jìn)行排序,這會影響導(dǎo)入性能;輔助索引將出現(xiàn)返回表的問題。如果過濾的數(shù)據(jù)量很大,直接全表掃描會更快。
對于OLAP業(yè)務(wù)查詢(OLAP 是在線分析處理,用于數(shù)據(jù)分析,它使我們能夠同時分析來自多個數(shù)據(jù)庫系統(tǒng)的信息),哈希連接是一個必不可少的功能。MySQL 8.0開始支持 Hash Join算法,加強(qiáng)了對 OLAP 業(yè)務(wù)的支持。
因此,如果您的查詢數(shù)據(jù)量不太大,并且查詢的響應(yīng)時間要求在分鐘級別,則可以使用單實例MySQL 8.0來完成大數(shù)據(jù)的查詢。
2、Hash JOIN 工作原理
Hash JOIN出現(xiàn)在MySQL 8.0的執(zhí)行計劃中,Hash JOIN 掃描關(guān)聯(lián)的兩個表:首先,在掃描驅(qū)動器表的過程中創(chuàng)建一個哈希表;當(dāng)掃描第二個表時,將在哈希表中搜索每個關(guān)聯(lián)記錄。如果找到,將返回記錄。
哈希連接選擇驅(qū)動程序表和嵌套循環(huán)連接算法,兩者基本相同。兩個較小的表都用作驅(qū)動程序表.如果驅(qū)動器表很大,并且創(chuàng)建的哈希表超過了內(nèi)存大小,MySQL將自動將結(jié)果轉(zhuǎn)儲到磁盤。
三、子查詢
我發(fā)現(xiàn)相當(dāng)多的開發(fā)同學(xué),包括我自己更喜歡編寫子查詢,而不是傳統(tǒng)的JOIN語句。
子查詢的邏輯非常清晰。雖然 JOIN 也可以滿足需求,但這并不容易理解,因為LEFT JOIN是一種代數(shù)關(guān)系,子查詢更傾向于從人類思維的角度來理解。
然而,在MySQL 8.0中,優(yōu)化器會自動將 in 子查詢優(yōu)化為 JOIN 執(zhí)行計劃,這將顯著提高性能。
我們只需要關(guān)注SQL執(zhí)行計劃,如果兩個執(zhí)行計劃相同,則性能沒有差異。
在MySQL 8.0之前,MySQL沒有完全優(yōu)化子查詢。因此,您將在子查詢的執(zhí)行計劃中看到DEPENDENT SUBQUERY的提示,這表明它是一個從屬子查詢,子查詢需要依賴外部表的關(guān)聯(lián)。DEPENDENT SUBQUERY的執(zhí)行速度可能非常慢,而且大多數(shù)時候您需要手動將其轉(zhuǎn)換為兩個表之間的連接。
所以這里博主提示大家,如果你的當(dāng)前的MySQL 8.0版本可以編寫子查詢,因為子查詢的優(yōu)化相當(dāng)完整;
對于 MySQL 8.0 之前版本的MySQL,需要查看所有子查詢的 SQL 執(zhí)行計劃。對于 DEPENDENT SUBQUERY 的提示,要進(jìn)行優(yōu)化,否則將對業(yè)務(wù)產(chǎn)生重大性能影響;DEPENDENT SUBQUERY的優(yōu)化通常被重寫為用于表連接的派生表。文章來源:http://www.zghlxwxcb.cn/news/detail-781203.html
總結(jié)
本文介紹MySQL數(shù)據(jù)庫中的左連接、右連接、內(nèi)連接與Hash連接的工作原理,并分析子查詢與 JOIN 的不同,根據(jù)本文所學(xué)提供一些工作中需要掌握的實戰(zhàn)技巧。
到了這里,關(guān)于【MySQL】左連接右連接內(nèi)連接與Hash連接、子查詢原理與實戰(zhàn)(MySQL專欄啟動)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!