SQL語句中in和exists效率問題

今天學習了一個問題,和大家分享下.

首先來糾正一個問題就是:大家普遍認爲正確的一個問題--exists比in效率高的說法是不準確的.

我們首先來講解in和exists的用法,區別:


1.如果兩個表中一個較小,另一個較大.則子查詢表大的,用exists,子查詢表小的用in:

  舉個例子,來說明問題.

訂單表Order_M(小表), 訂單明細表Order_Detail(大表).

SELECT *
  FROM Order_M m
 WHERE m.Order_ID IN (SELECT od.Order_ID FROM Order_Detail od)
那麼,這種效率就是比較低效的,用到了Order_M表上Order_ID列的索引;


 SELECT *
  FROM Order_M m
 WHERE EXISTS(SELECT od.Order_ID FROM Order_Detail od WHERE m.Order_ID=od.Order_ID)

那麼,這種效率就是比較高效的,用到了Order_Detail表上Order_ID列的索引.


2.相反的一種情況,不在贅述.


二 not in和not exists


1.如果查詢語句使用了not  in那麼內外表都進行全表掃描,沒有用到索引,而not extsts的子查詢依然能用到表上的索引。

2.所以無論那個表大,用not exists都比not in要快。


發佈了70 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章