MYSQL FIND_IN_SET ( str,strlist ) 与 INSTR( string1, string2 )

本文详细介绍了MySQL中的FIND_IN_SET和INSTR函数,以及它们与IN操作符在查询效率上的差异。FIND_IN_SET用于查找字符串在逗号分隔列表中的位置,而INSTR则返回子串在源字符串中首次出现的索引。通过示例,展示了三种方法在实际查询中的效率,结果显示IN操作符效率最高,FIND_IN_SET其次,INSTR最慢。因此,在选择查询方式时,应根据实际需求和数据结构来决定。
摘要由CSDN通过智能技术生成

————————————————
版权声明:本文为CSDN博主「炎升」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40482816/article/details/121142254

1、find_in_set() 函数 :

 查询字段(str)在(strlist)中的位置

1.1、语法

FIND_IN_SET (str,strlist

str :要查询的字符串

strlist :字段名, 参数以”,”分隔。 如 (1,2,6,8,10,22)。

注:

字符串str在 (由N个子链 组成的字符串列表strlist) 中,则返回值的范围在 1 到 N 之间。

如果str不在strlist中 或 strlist 为空字符串,则返回值为 0。

如任意一个参数为NULL,则返回值为 NULL。

1.2、示例:


    
    
  1. SELECT FIND_IN_SET( 'b', 'a,b,c,d'); -- 结果:2 ,因为b 在strlist集合中放在2的位置(从1开始)。
  2. select FIND_IN_SET( '1',"1,2,3"); -- 返回:1
  3. select FIND_IN_SET( '2',"1,2,3"); -- 返回:2
  4. select FIND_IN_SET( '',"1,2,3"); -- 返回:0
  5. select FIND_IN_SET( '2',""); -- 返回:0
  6. select FIND_IN_SET( null,"1,2,3"); -- 返回:null
  7. select FIND_IN_SET( '1', null); -- 返回:null
  8. select FIND_IN_SET( null, null); -- 返回:null

2、instr()函数

俗称:字符查找函数。 获取子串第一次出现的索引,如果没有找到,则返回0(从1开始)。

2.1、语法

格式一:

        instr( string1, string2 )   

        说明: instr(源字符串, 目标字符串)

       例如:INSTR('apple','a'),返回的查询结果是1(a出现在字符串‘apple’中的第一个索引;         

3、效率

IND_IN_SET 效率


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

INSTR 效率


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

IN 效率


    
    
  1. SELECT * FROM fast_input f where id in( '4', '14', '144');
  2. 受影响的行: 0
  3. 时间: 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 简单多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值