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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js zlib 模块
HTML input 元素
curl 的用法指南
MySQL 删除逗号分隔字段中的某一个值
macOS 使用 crontab 定时任务
视频剪辑软件 Shotcut 笔记
JavaScript DOM 查找元素
Photoshop 使用插件支持 webp 格式的文件