使用連接(JOIN)來(lái)代替子查詢(xún)(Sub-Queries)
MySQL從4.1開(kāi)始支持SQL的子查詢(xún)。這個(gè)技術(shù)可以使用SELECT語(yǔ)句來(lái)創(chuàng)建一個(gè)單列的查詢(xún)結(jié)果,然后把這個(gè)結(jié)果作為過(guò)濾條件用在另一個(gè)查詢(xún)中。例如,我們要將客戶(hù)基本信息表中沒(méi)有任何訂單的客戶(hù)刪除掉,就可以利用子查詢(xún)先從銷(xiāo)售信息表中將所有發(fā)出訂單的客戶(hù)ID取出來(lái),然后將結(jié)果傳遞給主查詢(xún),如下所示:
DELETE FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
使用子查詢(xún)可以一次性的完成很多邏輯上需要多個(gè)步驟才能完成的SQL操作,同時(shí)也可以避免事務(wù)或者表鎖死,并且寫(xiě)起來(lái)也很容易。但是,有些情況下,子查詢(xún)可以被更有效率的連接(JOIN).. 替代。例如,假設(shè)我們要將所有沒(méi)有訂單記錄的用戶(hù)取出來(lái),可以用下面這個(gè)查詢(xún)完成:
SELECT * FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用連接(JOIN).. 來(lái)完成這個(gè)查詢(xún)工作,速度將會(huì)快很多。尤其是當(dāng)salesinfo表中對(duì)CustomerID建有索引的話(huà),性能將會(huì)更好,查詢(xún)?nèi)缦拢?
SELECT * FROM customerinfo
LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.
CustomerID
WHERE salesinfo.CustomerID IS NULL
連接(JOIN).. 之所以更有效率一些,是因?yàn)?MySQL不需要在內(nèi)存中創(chuàng)建臨時(shí)表來(lái)完成這個(gè)邏輯上的需要兩個(gè)步驟的查詢(xún)工作
總結(jié)
本文關(guān)于MySQL優(yōu)化之使用連接(join)代替子查詢(xún)的內(nèi)容就到這里,僅供參考。如有不足之處請(qǐng)指出。歡迎大家交流討論。感謝朋友們對(duì)本站的支持。
您可能感興趣的文章:- MySQL里面的子查詢(xún)實(shí)例
- 解決MySQL中IN子查詢(xún)會(huì)導(dǎo)致無(wú)法使用索引問(wèn)題
- 詳細(xì)講述MySQL中的子查詢(xún)操作
- 詳解MySQL子查詢(xún)(嵌套查詢(xún))、聯(lián)結(jié)表、組合查詢(xún)
- mysql in語(yǔ)句子查詢(xún)效率慢的優(yōu)化技巧示例
- Mysql子查詢(xún)IN中使用LIMIT應(yīng)用示例
- MYSQL子查詢(xún)和嵌套查詢(xún)優(yōu)化實(shí)例解析
- mysql實(shí)現(xiàn)多表關(guān)聯(lián)統(tǒng)計(jì)(子查詢(xún)統(tǒng)計(jì))示例
- MySQL筆記之子查詢(xún)使用介紹
- MySQL子查詢(xún)中order by不生效問(wèn)題的解決方法