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

真诚赞赏,手留余香
赞赏
随机推荐
Win7 中安装 Composer (PHP)
Bootstrap 3.7 导航组件响应式CSS样式
Wordpress 学习笔记 1 常用
OpenSSL 创建 Nginx 可使用自建证书
JS事件冒泡与捕获、addEventListener--实例演示
CentOS 7 服务管理命令 systemctl
apiDoc 参考
ffmpeg 推送流到nginx服务器,生成m3u8 地址
thinkphp 3.1.3 添加项目分组
Simple Model