in、or、exists區別

in 和or區別:

如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。

如果in和or所在列沒有 索引的話,性能差別就很大了。在沒有索引的情況下,隨着in或者or後面的數據量越多,in的效率不會有太大的下降,但是or會隨着記錄越多的話性能下降 非常厲害

 因此在給in和or的效率下定義的時候,應該再加上一個條件,就是所在的列是否有索引或者是否是主鍵。如果有索引或者主鍵性能沒啥差別,如果沒有索引,性能差別不是一點點!

具體可參考:http://blog.chinaunix.net/uid-20639775-id-3416737.html

in和exists

in是把外表和內表作hash連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢,一直以來認爲exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in;

例如:表A(小表),表B(大表)

select * from A where cc in(select cc from B)  -->效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc)  -->效率高,用到了B表上cc列的索引。

相反的:

複製代碼
select * from B where cc in(select cc from A)  -->效率高,用到了B表上cc列的索引

select * from B where exists(select cc from A where cc=B.cc)  -->效率低,用到了A表上cc列的索引。

1.性能的考慮此時就按子表大主表小用exist,子表小主表大用in的原則就可以.
2.寫法的不同, exist的where條件是:      "......  where exist (..... where a.id=b.id)"
--in的where條件是: " ...... where  id in ( select id .... where a.id=b.id)"
 
複製代碼

 

not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
所以無論那個表大,用not exists都比not in要快

轉載:http://www.cnblogs.com/rainwang/p/4389282.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章