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="("mysql中select
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函数,⼀个效率⾼,⼀个书写⽅便。