普通LIKE
一般情况下like模糊查询的写法为(field已建立索引):
SELECT column FROM table WHERE field like '%keyword%'
上面的语句用explain解释来看,SQL语句并未用到索引,而且是全表搜索,如果在数据量超大的时候,可想而知最后的效率会是这样。对比下面的写法:
SELECT column FROM table WHERE field like 'keyword%'
这样的写法用explain解释看到,SQL语句使用了索引,搜索的效率大大的提高了!
LOCATE函数
LOCATE('substr',str,pos)
在MYSQL中,我们会遇到在某个字符串中查找指定的某个或几个字符,一般情况下,我们可以通过LIKE模糊查询来实现查找过程,,本文主要测试了LOCATE函数的用法。
LOCATE(substr,str)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr 不在str中,则返回值为0。
LOCATE(substr,str,pos)
该函数表示返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr 不在str中,则返回值为0。
SELECT column FROM table WHERE LOCATE('keyword', field)>0
备注:keyword是要搜索的内容,field为被匹配的字段,查询出所有存在keyword的数据
POSITION函数
POSITION(substr IN str)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr 不在str中,则返回值为0。
position可以看做是locate的别名,功能跟locate一样
SELECT column FROM table WHERE POSITION('keyword' IN filed)
INSTR函数
INSTR(str,substr)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr 不在str中,则返回值为0。这和LOCATE()的双参数形式相同,只是参数的顺序被颠
SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword' )>0
FIND_IN_SET
除了上述的方法外,还有一个函数FIND_IN_SET FIND_IN_SET(str1,str2)
返回str2中str1所在的位置索引,其中str2必须以”,”分割开。
SELECT * FROM `person` WHERE FIND_IN_SET('apply',`name`)