in notin exists not exists 性能優化算法總結

in notin exists not exists 性能優化算法總結

  • 1.1. in 和 exists 區別
  • 1.2. not in 能不能走索引
  • 1.3. not in 和 join 的關係
  • 1.4. 和 not Exists 的關係
  • 1.5. in 的實現過程

1.1. in 和 exists 區別

in 和exists 的區別是in 和exists 執行時,in 是先執行子查詢中的查詢,然後再執行主查詢。而exists查詢它是先執行主查詢,即外層表的查詢,然後再執行子查詢。

exists 和 in 在執行時效率單從執行時間來說差不多,exists要稍微優於in。在使用時一般應該是用exists 而不用in。

如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。

IN 不對NULL進行處理。

1.2. not in 能不能走索引

答案是有些可以有些不可以。

排除少量情況下 ,not in 基本就是等同遍歷了。

如果排除上萬數據,那走走索引還是有用的,排除的數據越多,走索引效果越好。具體的實現實現效果和數據庫類型和版本相關。一般越高級數據庫與版本會對此優化越好。。

如果遇到相關數據庫對此語句優化不好,那就需要利用適當調整sql語句,換個等義的更高性能寫法(一般可讀性會因此下降) 或者利用存儲過程自定義函數等自己實現性能高的notin算法,或者用編程語言實現

1.3. not in 和join 的關係

雖然not in 裏面排除多的情況下可以走索引,但數據庫具體實現可能沒有實現,此時可以使用join 代替代價就是可讀性相對會下降寫。

優先使用not in,其次join 代替 可讀性優先保證

1.4. 和 not Exists 的關係

含義上說 notin 基本就是notexist 也有可能是sql標準,待確定有可能不同的數據庫

區分是爲了實現倆種不同的查詢算法 有些數據庫倆種算法幾乎一樣效率,有些數據庫實現的不一樣。。

而且數據量大小不同的情況下,可能會走不同的路徑,不能一概而論。。

1.5. in 的實現過程

用in 寫出來的SQL 的優點是比較容易寫及清晰易懂,這比較適合現代軟件開發的風格。但是用in 的SQL 性能總是比較低的

從SQL執行的步驟來分析用IN的SQL與不用IN的SQL有以下區別:SQL試圖將其轉換成多個表的連接,如果轉換不成功則先執行IN裏面的子查詢,再查詢外層的表記錄,如果轉換成功則直接採用多個表的連接方式查詢。

可見用IN的SQL至少多了一個轉換的過程。一般的SQL都可以轉換成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章