兩者執行流程完全不一樣。
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 ...