in和exists過程對比

2022-03-16 16:22:11 字數 867 閱讀 2262

兩者執行流程完全不一樣。

select * from tablea a where a.id in (select b.a_id from tableb b);

1)首先子查詢,查詢b表中所有的 aid,結果集 listb。

2)進行外查詢,結果集 lista。

3)lista 和 listb 取笛卡爾積,即有 lista.len*listb.len 條記錄。根據 a.id=b.a_id 對笛卡爾積結果進行篩選。

for(t : lista.len*listb.len)

}retrun list;

所以,in的效率取決於in子查詢。

select * from tablea a where exists (select 1 from tableb b where a.id=b.a_id);

1)外查詢,這裡是select * from tablea a,結果集 lista。

2)對 lista 的 a.id 進行 exists 篩選。

for(a : lista.length)

}retrun list;

所以,exists的效率取決於外查詢.

當子查詢的結果集相對很大時,不要用 in, 避免笛卡爾積。

一般, 除非子查詢結果集很小(比如字典),否則都優先使用exists ??.

not in 和 not exists

雖然「一般情況下,使用exists比使用in更好」的說法不一定準確,

但是「一般情況下,使用 not exists 比使用 not in 更好」的說法是沒問題的。

使用 not in 會對外表和內錶進行全表掃瞄,會忽略掉索引;

使用not exists的子查詢可以使用表的索引的。

參考:

MySQL in和exists查詢對比

外表 tablea 內錶 tableb in select from tablea where tablea.id in select a id from tableb exists select from tablea where exists select from tableb where t...

MySQL中exists與in的使用 對比

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false。exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時 無論記錄行是的多少,只要能返回 條件就為真,返回當前loop到...

in 和 exists的比較

系統要求進行sql優化,對效率比較低的sql進行優化,使其執行效率更高,其中要求對sql中的部分in not in修改為exists not exists 修改方法如下 in的sql語句 select id,category id,htmlfile,title,convert varchar 20 ...