mysql查找以逗号分隔的值-find_in_set

需求:有一个表字段不少逗号的值,而后查询时候传入一些值,匹配全部数据内包含查询传入的这些值的数据函数

可能你一开始会想到 SELECT * FROM xujiantao WHERE game LIKE ‘%44′ 或者 ’44%’ ‘%44%’, 那么结果可能也会包含444的数据,不太准测试

一开始我用的正则匹配的,今天无心中发现了另一个MYSQL函数,废话很少说了spa

相信不少人也这么存过,假若有如下表数据:索引

20141013224532_88392.jpg

而后试下LIKE:class

20141013225606_80496.jpg

它把包含44和包含444的结果都输出了,而我只想获得44效率

固然你可使用正则这么玩:随机数

SELECT * FROM xujiantao WHERE game REGEXP ‘[\d]?,44,’;im

20141013231159_60883.jpg

比较简洁一点的,也就是最后要说的用法是FIND_IN_SET函数:数据

SELECT * FROM xujiantao WHERE FIND_IN_SET(44, game);查询

20141013231654_68377.jpg

一样没有把444和888的数据输出,最终获得了想要的数据

须要注意的是假如你用的是0X, 00X, 000X这样的数据查找须要加引号,不然找不到

20141013231939_43640.jpg

OK,我加了一百多万的随机数据,简单对比一下以上几种查询方式的效率

20141014000257_14131.jpg

使用LIKE查询包含2二、27三、239九、7390的结果,主要看下耗时

20141014002534_26809.jpg

1.29秒

使用正则查询包含2二、27三、239九、7390的结果

20141014002712_63069.jpg

使用FIND_IN_SET查询包含2二、27三、239九、7390的结果

20141014002811_35491.jpg

以上截图都是用的InnoDB引擎,game字段加了索引

后来改为MyIsam引擎又测试了下多个不一样条件查询,慢了差很少8%的速度

最后要说的就是FIND_IN_SET函数比LIKE和正则匹配快一些

正则写起来费劲,还要保证正确性,就算获得精确结果应该也不会太快

FIND_IN_SET比较快一些,OR 4个条件 的结果 LIMIT 20 也才 0.1秒,加个倒序0.4秒

MyIsam引擎:

20141015002256_58153.jpg

InnoDB引擎:
20141015002327_92168.jpg

相关文章
相关标签/搜索