第一步侥猩,創(chuàng)建測(cè)試表榔至,并生成測(cè)試數(shù)據(jù),測(cè)試數(shù)據(jù)為1000萬條記錄欺劳。數(shù)據(jù)庫(kù)版本為5.1.63唧取。數(shù)據(jù)庫(kù)中關(guān)閉了query cache,因此數(shù)據(jù)庫(kù)緩存不會(huì)對(duì)查詢?cè)斐捎绊憽?br>
第二步:分三中情況進(jìn)行測(cè)試划提,分別是:
第一種情況:in和or所在列為主鍵的情形枫弟。
第二種情況:in和or所在列創(chuàng)建有索引的情形。
第三種情況:in和or所在列沒有索引的情形鹏往。
每種情況又采用不同的in和or的數(shù)量進(jìn)行測(cè)試淡诗。由于測(cè)試語句的數(shù)據(jù)量有4種情況,我這里就稱為A組伊履、B組韩容、C組、D組,其中A組為3個(gè)值唐瀑,B組為150個(gè)值群凶,C組為300個(gè)值,D組為1000個(gè)值介褥。具體的測(cè)試語句如下:
測(cè)試結(jié)果如下:
第一種情況座掘,ID列為主鍵的情況递惋,4組測(cè)試執(zhí)行計(jì)劃一樣,執(zhí)行的時(shí)間也基本沒有區(qū)別溢陪。
A組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.002s in的執(zhí)行時(shí)間為:0.002s
B組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.004s in的執(zhí)行時(shí)間為:0.004s
C組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.006s in的執(zhí)行時(shí)間為:0.005s
D組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.018s in的執(zhí)行時(shí)間為:0.014s
第二種情況萍虽,ID列為一般索引的情況,4組測(cè)試執(zhí)行計(jì)劃一樣形真,執(zhí)行的時(shí)間也基本沒有區(qū)別杉编。
A組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.002s in的執(zhí)行時(shí)間為:0.002s
B組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.006s in的執(zhí)行時(shí)間為:0.005s
C組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.008s in的執(zhí)行時(shí)間為:0.008s
D組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:0.021s in的執(zhí)行時(shí)間為:0.020s
第三種情況,ID列沒有索引的情況咆霜,4組測(cè)試執(zhí)行計(jì)劃一樣邓馒,執(zhí)行的時(shí)間也基本沒有區(qū)別。
A組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:5.016s in的執(zhí)行時(shí)間為:5.071s
B組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:1min 02s in的執(zhí)行時(shí)間為:5.018s
C組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:1min 55s in的執(zhí)行時(shí)間為:5.018s
D組or和in的執(zhí)行時(shí)間: or的執(zhí)行時(shí)間為:6min 17s in的執(zhí)行時(shí)間為:5.057s
結(jié)論:
從上面的測(cè)試結(jié)果蛾坯,可以看出如果in和or所在列有索引或者主鍵的話光酣,or和in沒啥差別,執(zhí)行計(jì)劃和執(zhí)行時(shí)間都幾乎一樣脉课。如果in和or所在列沒有索引的話救军,性能差別就很大了。在沒有索引的情況下倘零,隨著in或者or后面的數(shù)據(jù)量越多唱遭,in的效率不會(huì)有太大的下降,但是or會(huì)隨著記錄越多的話性能下降非常厲害呈驶,從第三中測(cè)試情況中可以很明顯地看出了拷泽,基本上是指數(shù)級(jí)增長(zhǎng)。
因此在給in和or的效率下定義的時(shí)候袖瞻,應(yīng)該再加上一個(gè)條件司致,就是所在的列是否有索引或者是否是主鍵。如果有索引或者主鍵性能沒啥差別聋迎,如果沒有索引蚌吸,性能差別不是一點(diǎn)點(diǎn)!