MySQL的LIKE模糊查询优化

%xxx%这种方式对于数据量少的时候,咱们倒能够随意用,可是数据量大的时候,咱们就体验到了查询性能的问题,像老化的车子艰难趴着坡同样,而且这种方式并未使用到索引,而是全表扫描mysql

mysql 高效模糊查询 代替likesql

而对于xxx% 或者%xxx方式,explain一下能够发现查询使用到了索引,性能提高了很多,固然这种方式不适用与全部的查询场景。
能够采起如下的函数进行查询。
LOCATE('substr',str,pos)方法 POSITION('substr' IN field)方法 INSTR(str,'substr')方法

查询效率好比果:table.field like '%AAA%' 能够改成locate ('AAA' , table.field) > 0函数

  返回子串substr在字符串str第一个出现的位置,若是substr不是在str里面,返回0.
mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0
性能

该函数是多字节可靠的。spa

返回子串substr在字符串str第一个出现的位置,从位置pos开始。若是substr不是在str里面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5); -> 7code

 

mysql like模糊查询提升效率的奇葩方法blog

一张表大概40万左右的数据,用like模糊查询title字段,很慢,title字段已经创建了索引,mysql 对 someTitle% 这样的模糊查询在有索引的前提下是很快的。
因此下面这两台sql语句差异就很大了 
$sql1 = "...... title like someTitle%" (话费0.001秒)
$sql2 = "...... title like %someTitle%" (话费0.8秒)
这两句的效率相差了800倍,这很可观啊。
因此我有个想法:在不用分词的方法的前提下,把存储的title字段,加一个特别的前缀,好比"im_prefix",好比一条记录的title="我是标题党",那么存储的时候就存储为"im_prefix我是标题党"。
这样一来,咱们要模糊查找"标题党"这个关键词的时候,就把sql写成这样:
$sql1 = "...... title like im_prefix%标题党%" (花费0.001秒),前台显示数据的时候,天然把取到的title过滤掉"im_prefix"这个前缀了

索引

相关文章
相关标签/搜索