mysql中in與exists效率比較

2021-09-26 06:08:12 字數 850 閱讀 3373

首先我們來分別用in和exists寫兩個相同的語句:、

in:select * from a sno where in (select sno from b);

exists:

select * from a a where exists(select sno from b b where a.sno=b.sno);

我們先對用in寫的語句進行分析,首先執行應該是執行子查詢,首先將學生會的sno查詢出來將返回sno快取起來,然後通過遍歷student表將所有的sno與子查詢語句查詢到的學生會的sno比較,若相同則選出來,而exists則是將每乙個student中的sno放到子查詢中和學生會中的sno進行比較。

這裡我們進行假設,

當a表有100條資料,b表有10條資料時:

使用in會將b表裡的10條資料先查出來,然後快取起來。然後再將a表中的100條資料和快取中的10條資料一一比較。

而使用where則是將a表中的100條資料,放到子查詢語句中,依次比較是否相同,也就是說這時相比使用in,where多了99次進入b表查詢的時間。

所以,可以得出結論當b錶比a錶小的時候用in的效率更高。

而當a表有10條資料,b表有100條資料時:

使用in會將b表裡的100條資料先查出來,然後快取起來。然後再將a表中的10條資料和快取中的10條資料一一比較。

而使用where則是將a表中的10條資料,放到子查詢語句中,依次比較是否相同。

這時我們使用in的時候會將100條資料進行快取,而使用where則不用快取。當b表大於a表時快取的時間會大於進入b表查詢的時間;所以這個時候使用where的效率更高。

綜上:當a表大於b表時使用in效率更高,而b表大於a表時使用where效率更高。

MySQL中exists與in的使用

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時 無論記錄行是的多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件...

MySQL中exists與in的使用

總結 當涉及到外表和子查詢時,要考慮到exists和in 的選擇 exists的子句是乙個boolean條件,這個子句當能返回結果集則為true,不能返回結果集則為 false,子句為真所的記錄會被加入結果集,子句為假所的記錄被拋棄結果集為空 in查詢相當於多個or條件的疊加,in查詢就是先將子查詢...

mysql中exists與in的使用

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當exists裡的條件語句能夠返回記錄行時 無論記錄行是多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件就像乙...