前言

本文的测试是基于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. 一款比较实用齐全的jQuery 表单验证插件
  2. ​台媒:台积电2nm制程获重大突破
  3. WINCE基于MC8630的3G模块的控制和加载
  4. android自定义属性dimen,android代码里的dimen
  5. 便携式计算机推销洽谈方案,推销洽谈的方法
  6. 【特别版】考证与学习,结构与功能,之间的因果关系
  7. 在C#中使用SQL语句什么情况需要使用‘单引号’和“双引号”
  8. linux版小米随身WIFI驱动,在官网中您就可以下载小米随身wifi的驱动程序了
  9. c语言16进制与字符串互转,C语言版的16进制与字符串互转函数
  10. 七、项目进度管理(二)【题】
  11. 2021-03-11 Android 异常情况下长按power按键10s关机或者重启
  12. Rasa NLU 实践
  13. 前端——》H5页面开屏分离特效
  14. linux samba服务器的配置
  15. HttpWebRequest 介绍
  16. 新闻网实时数据步骤(毕业设计)
  17. 2022年度浦东新区科技发展基金社会领域数字化转型专项立项公示
  18. KubeVirt with YRCloudFile 擦出创新的火花
  19. 去除Flexgrid表格的隔行底色为白的样式
  20. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)

热门文章

  1. 基于云原生的火山引擎边缘云应用与实践
  2. 机器学习/深度学习/强化学习资料汇总
  3. Android中的羊角符,安卓开发binder
  4. ORACLE 11G R2 DGBROKER 之TAF
  5. html5 播放avi视频播放器,贫穷限制了你的才华?快来看如何用手机拍摄一部优秀作品?...
  6. ipv6地址校验方法汇总
  7. 浙江“一男娶两女”当事人谈婚礼真相
  8. Layui 弹出层之iframe层 获取弹出iframe层中控件值
  9. 济南吴家堡黄河大米 国稻种芯-中国水稻节:山东稻出振兴路
  10. 封装生成器FPM0.08详细使用教程 https://www.mcuzx.com/t-111.html (出处: MCU智学网)