MySQL中的in和exists區別

2021-10-11 22:19:50 字數 2124 閱讀 3919

in和exists的區別分析

select

*from a where id in

(select id from b)

;select

*from a where

exists

(select

1from b where a.id=b.id)

;

對於以上兩種情況,in是在記憶體裡遍歷比較,而exists需要查詢資料庫,所以當b表資料量較大時,exists效率優於in。

當b表資料較大時不適合使用in(),因為它會b表資料全部遍歷一次

結論:in()適合b錶比a表資料小的情況

當b錶比a表資料大時適合使用exists(),因為它沒有那麼多遍歷操作,只需要再執行一次查詢就行。

結論:exists()適合b錶比a表資料大的情況

1、in()語句內部工作原理

in()只執行一次,它查出b表中的所有id欄位並快取起來。之後,檢查a表的id是否與b表中的id相等,如果相等則將a表的記錄加入結果集中,直到遍歷完a表的所有記錄。

它的查詢過程類似於以下過程:

list resultset={};

array a=

(select

*from a)

;array b=

(select id from b)

;for

(int i=

0;i}}

return resultset;

可以看出,當b表資料較大時不適合使用in(),因為它會b表資料全部遍歷一次

例1:a表有10000條記錄,b表有1000000條記錄,那麼最多有可能遍歷100001000000次,效率很差。

例2:a表有10000條記錄,b表有100條記錄,那麼最多有可能遍歷10000100次,遍歷次數大大減少,效率大大提公升。

結論:in()適合b錶比a表資料小的情況

2、exists()語句內部工作原理

exists()會執行a.length次,它並不快取exists()結果集,因為exists()結果集的內容並不重要,重要的是其內查詢語句的結果集空或者非空,空則返回false,非空則返回true。

它的查詢過程類似於以下過程:

list resultset={};

array a=

(select

*from a)

;for

(int i=

0;i}return resultset;

當b錶比a表資料大時適合使用exists(),因為它沒有那麼多遍歷操作,只需要再執行一次查詢就行。

例1:a表有10000條記錄,b表有1000000條記錄,那麼exists()會執行10000次去判斷a表中的id是否與b表中的id相等。

例2:a表有10000條記錄,b表有100000000條記錄,那麼exists()還是執行10000次,因為它只執行a.length次,可見b表資料越多,越適合exists()發揮效果。

例3:a表有10000條記錄,b表有100條記錄,那麼exists()還是執行10000次,還不如使用in()遍歷10000*100次,因為in()是在記憶體裡遍歷比較,而exists()需要查詢資料庫,我們都知道查詢資料庫所消耗的效能更高,而記憶體比較很快。

結論:exists()適合b錶比a表資料大的情況

使用情況分析

當a表資料與b表資料一樣大時,in與exists效率差不多,可任選乙個使用。

exists與in的使用效率的問題,通常情況下採用exists要比in效率高,因為in有些mysql的版本是不走索引的,但是in後面的索引會失效。

「a\b表的id 欄位都要新增索引 ", 因為 id 查詢會 using index,直接查詢索引樹。 但要看實際情況具體使用:

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false。

ORACLE 中exist和in的區別

博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...

sql中in和exist語句的區別?

in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1 select from a where cc in ...

SQL中exist和in的執行效率問題

select from a where id in select id from b select a.from a a where exists select 1 from b b where a.id b.id 結論 1 看表資料規模,a表 b表,使用in a表2 無論什麼情況,not exis...