MySQL優(yōu)化之使用連接(join)代替子查詢(xún)
使用連接(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)中。例如,我們要將客戶基本信息表中沒(méi)有任何訂單的客戶刪除掉,就可以利用子查詢(xún)先從銷(xiāo)售信息表中將所有發(fā)出訂單的客戶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)有訂單記錄的用戶取出來(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ì)更好,查詢(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ì)本站的支持。
相關(guān)文章
MySql 錯(cuò)誤Incorrect string value for column
能使用中文進(jìn)行搜索,但是insert into 中文是可以的。我的數(shù)據(jù)庫(kù)和數(shù)據(jù)表中所有的charset都是設(shè)置的utf8。2010-12-12
MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎和分支現(xiàn)狀分析
在MySQL經(jīng)歷了2008年Sun的收購(gòu)和2009年Oracle收購(gòu)Sun的過(guò)程中,基本處于停滯發(fā)展的情況,在可以預(yù)見(jiàn)的未來(lái),MySQL是肯定會(huì)被Oracle擱置并且逐步雪藏消滅掉的。2011-03-03
MySQL數(shù)據(jù)庫(kù)中的嵌套查詢(xún)實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)中嵌套查詢(xún)的相關(guān)資料,嵌套查詢(xún)是SQL中的一種技術(shù),允許在一個(gè)查詢(xún)語(yǔ)句的某個(gè)部分嵌入另一個(gè)查詢(xún),它主要用于處理復(fù)雜的邏輯,如多層條件過(guò)濾和數(shù)據(jù)對(duì)比,需要的朋友可以參考下2024-12-12
mysql數(shù)據(jù)庫(kù)中字段的注釋和類(lèi)型長(zhǎng)度獲取方式
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)中字段的注釋和類(lèi)型長(zhǎng)度獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
mysql如何查詢(xún)兩個(gè)日期之間最大的連續(xù)登錄天數(shù)
在現(xiàn)在的很多網(wǎng)站中都有這樣一個(gè)功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過(guò),不一定一直在線,但是只要有過(guò)登錄即可。這篇文章主要介紹的是利用sql語(yǔ)句如何查詢(xún)?cè)趦蓚€(gè)日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來(lái)一起看看吧。2016-10-10
mysql日期函數(shù)TO_DAYS()函數(shù)的詳細(xì)講解
在SQL中我們經(jīng)常需要根據(jù)時(shí)間字段查詢(xún)數(shù)據(jù),今天用到一個(gè)好用的時(shí)間字段,用來(lái)查詢(xún)一整天的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于mysql日期函數(shù)TO_DAYS()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08

