打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MySQL的LIKE模糊查询优化

%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"这个前缀了

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
MySQL的前缀索引及Oracle的类似实现
MySQL中判断一个字符串中是否存在另一字符串
mysql基础知识扫盲
mysql使用教程指南
php导入大量数据到mysql性能优化技巧
MySQL手工注入学习-1
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服