《MYSQL數據庫mysql中or效率高還是in效率高》要點:
本文介紹了MYSQL數據庫mysql中or效率高還是in效率高,希望對您有用。如果有疑問,可以聯系我們。
- #創建測試的test表?
- DROP?TABLE?IF?EXISTS?test;??
- CREATE?TABLE?test(??
- ????ID?INT(10)?NOT?NULL,??
- ????`Name`?VARCHAR(20)?DEFAULT?''?NOT?NULL,??
- ????PRIMARY?KEY(?ID?)??
- )ENGINE=INNODB?DEFAULT?CHARSET?utf8;??
- ?
- #創建生成測試數據的存儲過程?
- DROP?PROCEDURE?IF?EXISTS?pre_test;??
- DELIMITER?//?
- CREATE?PROCEDURE?pre_test()??
- BEGIN??
- DECLARE?i?INT?DEFAULT?0;??
- SET?autocommit?=?0;??
- WHILE?i<10000000?DO??
- INSERT?INTO?test?(?ID,`Name`?)?VALUES(?i,?CONCAT(?'Carl',?i?)?);??
- SET?i?=?i+1;??
- IF?i%2000?=?0?THEN??
- COMMIT;??
- END?IF;??
- END?WHILE;??
- END;?//?
- DELIMITER?;?
- ?
- #執行存儲過程生成測試數據?
- CALL?pre_test();?
第二步:分三中情況進行測試,分別是:
第一種情況:in和or所在列為主鍵的情形.
第二種情況:in和or所在列創建有索引的情形.
第二種情況:in和or所在列沒有索引的情形.
每種情況又采用不同的in和or的數量進行測試.由于測試語句的數據量有4種情況,我這里就稱為A組、B組、C組、D組,其中A組為3個值,B組為150個值,C組為300個值,D組為1000個值.
測試結果如下:
第一種情況,ID列為主鍵的情況,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.018s???? in的執行時間為:0.014s
第二種情況,ID列為一般索引的情況,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.021s???? in的執行時間為:0.020s
第三種情況,ID列沒有索引的情況,4組測試執行計劃一樣,執行的時間也基本沒有區別.
A組or和in的執行時間: or的執行時間為:5.016s????? in的執行時間為:5.071s
B組or和in的執行時間: or的執行時間為:1min 02s???? in的執行時間為:5.018s
C組or和in的執行時間: or的執行時間為:1min 55s???? in的執行時間為:5.018s
D組or和in的執行時間: or的執行時間為:6min 17s???? in的執行時間為:5.057s
結論:
??? 從上面的測試結果,可以看出如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣.如果in和or所在列沒有索引的話,性能差別就很大了.在沒有索引的情況下,隨著in或者or后面的數據量越多,in的效率不會有太大的下降,但是or會隨著記錄越多的話性能下降非常厲害,從第三中測試情況中可以很明顯地看出了,基本上是指數級增長.
?? 因此在給in和or的效率下定義的時候,應該再加上一個條件,就是所在的列是否有索引或者是否是主鍵.如果有索引或者主鍵性能沒啥差別,如果沒有索引,性能差別不是一點點!
?MYSQL數據庫
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5797.html