MySQL函数:IN()、INSTR()、FIND_IN_SET()效率比较

最近项目有一个需求:MySQL查询多个id。我恰好用到了 IN()、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条数据。

 

三、IN、INSTR、FIND_IN_SET 效率比较

 

1、FIND_IN_SET 效率

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

 

2、INSTR 效率

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

 

3、IN 效率

SELECT * FROM fast_input f where id in('4','14','144');
受影响的行: 0
时间: 0.001s

 

从上面这里可以清楚的看到,IN由于使用了主键的索引,效率最高。其次是 FIND_IN_SET,最慢的是INSTR。

从而得到一个效率结果排名:IN() 效率 > FIND_IN_SET() > INSTR()

 

总结:

在实际应用中,大家可以根据实际情况使用IN或者FIND_IN_SET函数,一个效率高,一个运用方便。

像我这里,传过来接收的参数是一个类似于:'1,2,3,4,5,6' 的字符串,这种情况直接用 IN 是无效的,需要把字符串分割再重新组装,我就需要直接用 FIND_IN_SET 简单多了。

    A+
发布日期:2020年08月25日 16:39:07  所属分类:MySQL
最后更新时间:2020-08-25 16:43:09
付杰
  • ¥ 99.0元
  • 市场价:199.0元
  • ¥ 98.0元
  • 市场价:298.0元
  • ¥ 1999.0元
  • 市场价:2999.0元
  • ¥ 198.0元
  • 市场价:298.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  0   博主  0

  1. 头像 老古董 5

    find_in_set()函数走索引么?

    • 付杰 付杰

      @老古董 索引和函数其实没什么关系,只要你的数据库字段有索引,肯定走索引,除非字段没有设置索引。