MySQL中比like更高效的模糊搜索写法

发布时间:2018-01-10 18:50:14编辑:丝画阁阅读(830)

写历史小文章的痛苦在于找不到什么吸睛的题材,而且个人文笔也不够有趣。还是写写我的老本行,内容是一抓一大把呀。下面直接上干货。

我们以前在模糊搜索的时候,大多数运用LIKE写法:

SELE CT `column` FROM `table` where `condition` like`%keyword%'

事实上,可以使用 locate(position) 和 instr这两个函数来代替:

1、LOCATE语句

返回子串 keyword 在字符串 condition 中第一次出现的位置。如果子串 keyword 在 condition 中不存在,返回值为 0:

mysql> SELE CT `column` from `table` where locate(‘keyword’,`condition`)>0

2、POSITION语句(LOCATE 的別名 POSITION)

mysql> SELE CT `column` from `table` where position('keyword' IN `condition`)

3、INSTR语句

mysql> SELE CT `column` from `table` where instr(`condition`,'keyword')>0

locate、position 和 instr 的差別只是参数的位置不同,同时locate多一个起始位置的参数外,两者是一样的。

mysql> SELE CT `column` from `table` where LOCATE(‘bar’, ‘toolbarbar’,5);

-> 8

返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。

附加一个,我们还可以使用FIND_IN_SET使搜索更加有效率

find_in_set(str1,str2) 函数:返回str2中str1所在的位置索引,其中str2必须以","分割开。

例:sele ct * from `table` where find_in_set('keyword',`condition`)

在mysql中做数据库查询时,需要得到某字段中包含某个值的记录,这时候使用like是不能解决问题的,find_in_set就解决了我们的问题。

表users

==============================

id | level

1 | 1,2,3

2 | 1,25,3

mysql> SELE CT * FROM users WHERE level LIKE '%2%'

上面会把在level字段中含有“2”这个字符的两条结果都查询出来;

mysql> SELE CT * FROM users WHERE find_in_set(2,level)

上面才会得到我们需要的结果;

由此可见:like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要精准于like。

MySQL中比like更高效的模糊搜索写法

优化无止境

关键字