%xxx%这种方式对于数据量少的时候,我们倒可以随意用,但是数据量大的时候,我们就体验到了查询性能的问题,像老化的车子艰难趴着坡一样,并且这种方式并未使用到索引,而是全表扫描
mysql 高效模糊查询 代替like 而对于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 该函数是多字节可靠的。 返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0。 mysql> select LOCATE('bar', 'foobarbar',5); -> 7 mysql like模糊查询提高效率的奇葩方法
一张表大概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"这个前缀了
|