mysql in or 效率對比

第一步,創(chuàng)建測試表,并生成測試數(shù)據(jù),測試數(shù)據(jù)為1000萬條記錄。數(shù)據(jù)庫版本為5.1.63。數(shù)據(jù)庫中關(guān)閉了query cache,因此數(shù)據(jù)庫緩存不會對查詢造成影響。
第二步:分三中情況進行測試,分別是:
第一種情況:in和or所在列為主鍵的情形。
第二種情況:in和or所在列創(chuàng)建有索引的情形。
第三種情況:in和or所在列沒有索引的情形。
每種情況又采用不同的in和or的數(shù)量進行測試。由于測試語句的數(shù)據(jù)量有4種情況,我這里就稱為A組、B組、C組、D組,其中A組為3個值,B組為150個值,C組為300個值,D組為1000個值。具體的測試語句如下:
測試結(jié)果如下:
第一種情況,ID列為主鍵的情況,4組測試執(zhí)行計劃一樣,執(zhí)行的時間也基本沒有區(qū)別。
A組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.002s in的執(zhí)行時間為:0.002s
B組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.004s in的執(zhí)行時間為:0.004s
C組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.006s in的執(zhí)行時間為:0.005s
D組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.018s in的執(zhí)行時間為:0.014s

第二種情況,ID列為一般索引的情況,4組測試執(zhí)行計劃一樣,執(zhí)行的時間也基本沒有區(qū)別。
A組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.002s in的執(zhí)行時間為:0.002s
B組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.006s in的執(zhí)行時間為:0.005s
C組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.008s in的執(zhí)行時間為:0.008s
D組or和in的執(zhí)行時間: or的執(zhí)行時間為:0.021s in的執(zhí)行時間為:0.020s

第三種情況,ID列沒有索引的情況,4組測試執(zhí)行計劃一樣,執(zhí)行的時間也基本沒有區(qū)別。
A組or和in的執(zhí)行時間: or的執(zhí)行時間為:5.016s in的執(zhí)行時間為:5.071s
B組or和in的執(zhí)行時間: or的執(zhí)行時間為:1min 02s in的執(zhí)行時間為:5.018s
C組or和in的執(zhí)行時間: or的執(zhí)行時間為:1min 55s in的執(zhí)行時間為:5.018s
D組or和in的執(zhí)行時間: or的執(zhí)行時間為:6min 17s in的執(zhí)行時間為:5.057s

結(jié)論:
從上面的測試結(jié)果,可以看出如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執(zhí)行計劃和執(zhí)行時間都幾乎一樣。如果in和or所在列沒有索引的話,性能差別就很大了。在沒有索引的情況下,隨著in或者or后面的數(shù)據(jù)量越多,in的效率不會有太大的下降,但是or會隨著記錄越多的話性能下降非常厲害,從第三中測試情況中可以很明顯地看出了,基本上是指數(shù)級增長。
因此在給in和or的效率下定義的時候,應(yīng)該再加上一個條件,就是所在的列是否有索引或者是否是主鍵。如果有索引或者主鍵性能沒啥差別,如果沒有索引,性能差別不是一點點!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容