前言

本文的测试是基于740w条测试数据进行的,只讨论like模糊查询的优化方案。其他SQL优化可参考:
SQL优化的几种方式

查询开头是“今天不开心”的聊天记录,是可以走索引的。

select * from message_1 where content like "今天不开心%”;

查询包含“今天不开心”的聊天记录,是不能走索引的。

select * from message_1 where content like "%今天不开心%";

咱们主要优化的是第二种情况,我本人测试查询耗时是在9秒。

优化方案

对于查询包含某个关键词的需求,从业务上来说应尽量避免这种不合理的需求。

但是实际使用中,总有些类似需求避免不掉模糊查询,就可以采取下列优化方式。

  • 稍微优化
select * from message_1 where instr(content, "今天不开心") > 0;
select  * from message_1 where locate("今天不开心", content) > 0;

这个方法优化效果有限,这两种方法耗时相差不多,比不优化要快上2~3秒。

我还测试了一些其他的一些情况,这种优化方式,在某些情况下会比优化前还要慢,由此可见这种方式是有坑的

比如优化前:

select content from message_1 where content like "%今天不开心%";

优化后:

select content from message_1 where instr(content, "今天不开心") > 0;select content from message_1 where locate("今天不开心", content) > 0;

这种情况,优化后比不优化要慢上2秒左右。。。。

  • 大幅度优化
select * from message_1 where content in
(select content from message_1 where content like "%今天不开心%");

这种方法,能将查询优化至3秒左右,优化效果已经很明显。

优化原理:用索引全扫描取代表的全扫描。因为索引全扫描的代价是全表扫描的1/N (即索引块数与数据块数的比例),表数据越多,优化效果越明显。

优化后的sql语句,根据索引再回表的代价要看符合条件的记录数多少:如果in子查询返回的记录数很少,那么优化的效果就相当于效率提高了N倍;如果in子查询返回的记录数较多,两种SQL的性能区别就不是很明显了。

  • 根本优化

使用ClickHouse 或者 Elasticsearch 同步数据库。

这两种方式可以从根本上解决模糊查询的高延时,但是需要引入一套新的系统,代价还是不小的。

二者的对比可参考:
Elasticsearch和Clickhouse基本查询对比
ClickHouse 与es比较

mysql 模糊查询like优化方案(亲测)相关推荐

  1. MySQL模糊查询性能优化

    一.背景 我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是"孙"的数据 ...

  2. MySQL模糊查询like优化,再也用不着 like+% 了

    我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此,类似这样的需求还有很多,例如,搜索引擎需要根基用户数据的关键字进行全文查找,电子商务 ...

  3. 微信小程序 连接云数据库(不使用云函数)进行 登录、注册、查询(包括模糊查询)快速实现 亲测可用

    当连接MySQL的时候总是出现各种各样的小问题,可以选用微信小程序自带的云数据库 目 录 建立云数据库 建表 导入MySQL中的表 导出 导入 云数据库初始化 登录注册 注册功能 登录功能 查询(模糊 ...

  4. mysql模糊查询的优化方法--亲自实践

    数据有4W多条,不多,但是模糊查询 起来特别慢. 1,尝试过用 select * from (select * from a union all select * from b...很多表union) ...

  5. mysql模糊查询like优化

    1.使用全文索引 MySQL 之全文索引:https://blog.csdn.net/mrzhouxiaofei/article/details/79940958 -- 直接查询400ms SELEC ...

  6. mysql模糊查询之索引优化

    mysql模糊查询之索引优化 三表连查之模糊查询索引优化 注:具体用法10和11步骤. 1.t_project表 DROP TABLE IF EXISTS `t_project`; CREATE TA ...

  7. mysql模糊查询提速_【MySQL】Mysql模糊查询like提速优化

    [MySQL]Mysql模糊查询like提速优化 在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候 ...

  8. 【mysql】mysql 模糊查询 like 语句

    mysql 模糊查询 like 语句 一 like 语句 %xxx%:查询 username 字段中包含 xxx 的记录. select * from user where username like ...

  9. # Sql语句过长报错、查询慢优化方案探索

    Sql 过长查询报错.in过多.查询慢优化方案探索 目录 文章目录 Sql 过长查询报错.in过多.查询慢优化方案探索 目录 背景描述 解决方案 方案1(内存中过滤) 存在问题 方案2 In 查询的内 ...

最新文章

  1. VB.net实现从ListView控件中异地获取文本内容源代码
  2. oracle dump 文件解析,oracle 事件转储udump文件
  3. 设计模式-装饰者模式[Decorator]
  4. 低学历者为何能骗取30万年薪职位
  5. 多个值合并成一个字段oracle排序,Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)...
  6. Datalogic得利捷推出物流应用领域全新标杆产品——AV900
  7. android9三星功能,三星开启安卓9.0测试:One UI Beta计划
  8. Cadence输出Gerber文件
  9. 高通模式9008模式linux,学会小米9008高通模式_原来刷机如此简单
  10. HTML5 webSQL动态查询应用截图
  11. C语言入门-跑步问题
  12. RPA手把手—— RPA 数据库篇 6 - MySQL 篇 2 - 增删改查 1
  13. 慎重决定!从自建服务器到选择阿里云
  14. 华为nova 3e,重新编译内核文件,解除ptrace限制,以使用Frida
  15. KL散度,JS散度,余弦距离,欧式距离
  16. 类变量、成员变量、实例变量、局部变量、静态变量、全局变量 的解释。
  17. Proxy_代理模式
  18. shell-xargs
  19. 乐教乐学显示服务器故障怎么了,乐教乐学常见问题有哪些,如何解决闪退问题...
  20. RHS和LRS查找区别

热门文章

  1. MathType行距问题
  2. SAP 中货币汇率转换解析
  3. CMD命令运行java程序
  4. Anaconda环境下在cmd中执行Python命令
  5. Word文档中封面的下划线如何精确对齐
  6. OpenCV——Delaunay三角剖分(C++实现)
  7. java aa 咖啡怎样冲泡_咖啡的正确冲泡方式
  8. 浮点数在内存中的存储规则
  9. ICMP丢包问题分析
  10. 第三期 C/C++数据结构 栈的基本操作