SQL優化關於or與in使用
網上有很多人都在談論or與in的使用,有的說二者沒有什麼區別,其實不然,估計是測試做的不夠,其實or的效率為O(n),而in的效率為O(log2n),當基數越大時,in的效率就能凸顯出來了。
有人做了這麼一組實驗(測試庫資料為1000萬條記錄):A組分別用or與in查詢3條記錄,B組分別用or與in查詢120條記錄,C組分別用or與in查詢500條記錄,D組分別用or與in查詢1000條記錄.
第一種情況,目標列為主鍵的情況,4組測試執行計劃一樣,執行的時間也基本沒有區別。
A組or和in的執行時間: or的執行時間為:0.002s in的執行時間為:0.002s
B組or和in的執行時間: or的執行時間為:0.004s in的執行時間為:0.004s
C組or和in的執行時間: or的執行時間為:0.006s in的執行時間為:0.005s
D組or和in的執行時間: or的執行時間為:0.017s in的執行時間為:0.014s
第二種情況,目標列為一般索引的情況,4組測試執行計劃一樣,執行的時間也基本沒有區別。
A組or和in的執行時間: or的執行時間為:0.002s in的執行時間為:0.002s
B組or和in的執行時間: or的執行時間為:0.006s in的執行時間為:0.005s
C組or和in的執行時間: or的執行時間為:0.008s in的執行時間為:0.008s
D組or和in的執行時間: or的執行時間為:0.020s in的執行時間為:0.019s
第三種情況,目標列沒有索引的情況,4組測試執行計劃就不一樣,執行的時間也有了很大的區別。
A組or和in的執行時間: or的執行時間為:5.016s in的執行時間為:5.071s
B組or和in的執行時間: or的執行時間為:1min 02s in的執行時間為:5.018s
C組or和in的執行時間: or的執行時間為:1min 50s in的執行時間為:5.010s
D組or和in的執行時間: or的執行時間為:6min 13s in的執行時間為:5.047s
結論:
in和or的效率,取決目標條件列是否有索引或者是否是主鍵,如果有索引或者主鍵效能沒啥差別,如果沒有索引,in的效能要遠遠優於or.