MySQL 函数 FIND_IN_SET 和 IN 的区别

MySQL手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)


str 要查询的字符串

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

查询字段(strlist)中包含(str)的结果,返回结果为null或记录


假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。



FIND_IN_SET 和 IN 的区别


select * from tb_article where FIND_IN_SET(id, '1,2,3,4,5'); 

有点类似in (集合) 

select * from treenodes where id in (1,2,3,4,5);


在MySQL中 where in条件如果是字符串,会自动转化成int类型,内部使用了 CAST('6,8,3,2' AS INT),导致’6,8,3,2‘ 变成了6,所以查询一中 tags_title只有一个。解决方法是使用查询二中的 FIND_IN_SET


FIND_IN_SET 和 IN 的性能对比

大数据量的情况下不适合用find_in_set, 不过有些表的数据可能永远就那么点数据,这个时候为了减少表数量,可以使用FIND_IN_SET 。


使用explain查看执行计划,Extra列看到Using temporary就意味着使用了临时表。


参考:

https://javascript.net.cn/article?id=765

修改时间 2021-04-11

声明:本站所有文章和图片,如无特殊说明,均为原创发布,转载请注明出处。
随机推荐
Git push 错误:Updates were rejected because the remote contains work that you do not have locally
WordPress 常用的路径
JavaScript window 对象
CSS 改变 svg 图片颜色
JavaScript 操作表单
JavaScript 触摸事件
Nginx 使用 Njs 授权访问文件
CRSF 跨站脚本攻击已死,使用 Same-Site Cookies 来防范 CSRF