需求:有一个表字段很多逗号的值,然后查询时候传入一些值,匹配所有数据内包含查询传入的这些值的数据
可能你一开始会想到 SELECT * FROM xujiantao WHERE game LIKE ‘%44′ 或者 ’44%’ ‘%44%’, 那么结果可能也会包含444的数据,不太准
一开始我用的正则匹配的,今天无意中发现了另外一个MYSQL函数,废话不多说了
相信很多人也这么存过,假如有以下表数据:
然后试下LIKE:
它把包含44和包含444的结果都输出了,而我只想得到44
当然你可以使用正则这么玩:
SELECT * FROM xujiantao WHERE game REGEXP ‘[\d]?,44,’;
比较简洁一点的,也就是最后要说的用法是FIND_IN_SET函数:
SELECT * FROM xujiantao WHERE FIND_IN_SET(44, game);
同样没有把444和888的数据输出,最终得到了想要的数据
需要注意的是假如你用的是0X, 00X, 000X这样的数据查找需要加引号,否则找不到
OK,我加了一百多万的随机数据,简单对比一下以上几种查询方式的效率
使用LIKE查询包含22、273、2399、7390的结果,主要看下耗时
1.29秒
使用正则查询包含22、273、2399、7390的结果
使用FIND_IN_SET查询包含22、273、2399、7390的结果
以上截图都是用的InnoDB引擎,game字段加了索引
后来改成MyIsam引擎又测试了下多个不同条件查询,慢了差不多8%的速度
最后要说的就是FIND_IN_SET函数比LIKE和正则匹配快一些
正则写起来费劲,还要保证正确性,就算得到精确结果应该也不会太快
FIND_IN_SET比较快一些,OR 4个条件 的结果 LIMIT 20 也才 0.1秒,加个倒序0.4秒
MyIsam引擎:
InnoDB引擎:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。