MYSQL中IN,INSTR,FIND_IN_SET函數效率比較


今天寫代碼時前台傳過來類似‘1,2,3,4,5,6’的字符串,這種情況直接用IN是無效的,需要把字符串分割成數組或者組裝成列表,然后再利用mabatis的foreach函數

<select id = "queryXXX",resultType = "XXX", paramterType = "java.lang.HashMap">
SELECT * FROM fast_input f where id in
<foreach item="item" index="index" collection="list" open="("
            separator="," close=")">
            #{item}  
         </foreach>
</select>

或者可以用INSTR,FIND_IN_SET等函數,正好借此測試了下這個三個函數的效率。

建表:

CREATE TABLE `fast_input` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `content` varchar(100) DEFAULT NULL COMMENT '內容',
  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

循環插入數據

INSERT INTO fast_input(content) SELECT content FROM fast_input

我用了65000條數據,分別執行以下語句

 

SELECT * FROM fast_input f where FIND_IN_SET(id,'4,14,144');
受影響的行: 0
時間: 0.022s

SELECT * FROM fast_input f where INSTR(CONCAT(',','4,14,144',','),CONCAT(',',id,','))>0;
受影響的行: 0
時間: 0.032s

SELECT * FROM fast_input f where id in('4','14','144');
受影響的行: 0

時間: 0.001s

 

可以看到,IN由於使用了主鍵的索引,效率最高,且甩另兩個方法一個數量級,其次是FIND_IN_SET,最慢的是INSTR。但是有個問題大家注意下:

SELECT * FROM fast_input f where FIND_IN_SET('4',id);
受影響的行: 0
時間: 0.021s

SELECT * FROM fast_input f where FIND_IN_SET(id,'4');
受影響的行: 0

時間: 0.018s

同為FIND_IN_SET,參數位置不同,效率也有影響,有興趣的可以自己研究下為什么。

PS:實際應用中,大家可以根據實際情況使用IN或者FIND_IN_SET函數,一個效率高,一個書寫方便。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM