mysql find in set 效率_MYSQL中IN,FIND_IN_SET函数使用方法和效率比较(转)

今天写代码时前台传过来类似‘1,2,3,4,5,6’的字符串,这种情况直接用IN是无效的,需要把字符串分割成数组或者组装成列表,然后再利用foreach函数遍历出来

或者可以用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函数,一个效率高,一个书写方便。

laravel中的写法:Article::select("id", 'title', 'newstime')->where($wh)->orderBy('id', 'DESC')->whereRaw('FIND_IN_SET(school_id,"'.$scholStr.'") ')->take(10)->get()->toArray();

//以下是laravel读数据库数据

$schols = DB::select("select id from hg_schools where province = $province");

$scholStr = implode(",", array_column($schols,'id'));读出字段集合

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值