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