一般情况下like模糊查询的写法为(field已建立索引):
SELECT `column` FROM `table` WHERE `field` like ‘%keyword%’;
上面的语句用explain解释来看,SQL语句并未用到索引,而且是全表搜索,如果在数据量超大的时候,可想而知最后的效率会是怎样。
对比下面的写法:
SELECT `column` FROM `table` WHERE `field` like ‘keyword%’;
这样的写法用explain解释看到,SQL语句使用了索引,搜索的效率大大的提高了!但这并不符合所有的查询要求。
解决方法1:LOCATE
LOCATE(substr,str), LOCATE(substr,str,pos)
第一个语法返回substr在字符串str+的第一个出现的位置。第二个语法返回子符串+substr+在字符串str,从pos处开始的第一次出现的位置。如果substr+不在str+中,则返回值为0。
SELECT LOCATE(‘sllo’, `hellohello`);
##返回0
SELECT LOCATE(‘llo’, `hellohello`);
##返回3
SELECT LOCATE(‘llo’, `hellohello`, 5);
##返回8
注:keyword是要搜索的内容,field为被匹配的字段,查询出所有存在keyword的数据
SELECT `column` FROM `table` WHERE LOCATE(‘keyword’, `field`)>0;
解决方法2:POSITION
POSITION('substr' IN `field`)
position可以看做是locate的别名,功能跟locate一样
SELECT `column` FROM `table` WHERE POSITION(‘keyword’ IN `field`)>0;
解决方法3:INSTR
INSTR(`str`,'substr')
SELECT `column` FROM `table` WHERE INSTR(`field`, ‘keyword’)>0;
除了上述的方法外,还有一个函数
FIND_IN_SET(str1, str2);
返回str2中str1所在的位置索引,其中str2必须以”,”分割开。
使用like,还是使用locate+position高效的前提条件是查询的字段上面已经建立起了索引。