「Oracle」in與exists,你站哪一邊

說來慚愧,小編一直以為EXISTS的效率會高,直到今天,小編才知道自己錯了。

今天,生產報來了個問題,有個功能菜單查詢好慢,小編立馬翻出SQL一看,o(︶︿︶)o 唉,沒問題啊,然後想起用了mybatis的PageHelper,然後COUNT了一下SQL,不COUNT不知道,一COUNT嚇一跳,這一SQL花費了十幾秒,我的天啊。然後排查問題,到了這一個EXISTS語句,去掉後,SQL查詢速度飛快,小編抓了抓頭,把這個匹配條件改為了IN,執行,速度也飛快。這讓當時的小編懷疑了下人生,下班回來查了下百度。

據說,IN與EXISTS沒有誰效率高這一說法,誰快誰慢,得看實際的應用場景,且看下面兩條sql:

SELECT * FROM A WHERE A.ID IN (SELECT B.ID FROM B);

SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.ID = B.ID);

這兩個情況在數據量少的時候,耗時基本沒有出入。

  • 第一種情況呢,表B的數據量少的話,查詢速度會很快,使用的是表A的索引;
  • 第二種情況呢,正好相反,表A的數據量少,查詢速度會很快,使用的是表B的索引。

所以,小編根據這樣的理解,分為了7個場景:

  1. 表A數據量少時,使用EXISTS;
  2. 表B數據量少時,使用IN;
  3. 表A與表B數據量相仿時,表A有索引時使用IN;
  4. 表A與表B數據量相仿時,表B有索引時使用EXISTS;
  5. 表A與表B數據量都少時,隨便用;
  6. 表A與表B都有索引時,隨便用;
  7. 表A與表B都沒索引時,且數據量大時,且行且珍惜吧。

理解比較膚淺,有更好的解答或哪裡錯了的話,歡迎為小編指正,小編在此謝過。


分享到:


相關文章: