当前位置: 首页 > news >正文

《从 MyBatis-Plus 到 Elasticsearch:一个后端的性能优化踩坑实录》

最近接手了一个老项目,单表查询用 MyBatis-Plus 写得飞起,但一到​​多表关联+模糊搜索​​就卡成 PPT。痛定思痛,决定引入 Elasticsearch 优化查询性能,结果踩坑无数……记录下这次​​从 ORM 到搜索引擎​​的升级历程,分享给同样被慢查询折磨的你。

1. 问题定位:MP 的舒适区边界​

MyBatis-Plus 的 QueryWrapper 在单表操作中确实优雅:

// 条件查询示例(单表)
List<User> users = userService.lambdaQuery().eq(User::getStatus, 1).like(User::getName, "张").list();

但遇到​​跨表 JOIN + 高并发模糊查询​​时,MySQL 直接裂开:

  • 大表 LIKE '%关键词%' 导致全表扫描
  • 分页 COUNT 计算拖慢响应(即使用了 PageHelper

​结论​​:MP 适合 OLTP 简单场景,OLAP 复杂查询得换方案。


​2. 技术选型:ES 还是 ClickHouse?​

面对海量数据搜索,纠结了两个方案:

方案优点缺点
​Elasticsearch​实时搜索快,支持分词高亮资源占用高,学习曲线陡峭
​ClickHouse​列式存储,聚合分析强不适合频繁更新/点查

最终选择 ​​ES​​,因为:

  1. 业务需求以​​模糊搜索+排序​​为主(如商品名称、用户昵称)
  2. 已有 ES 集群,可复用运维资源

​3. 实战:SpringBoot 集成 ES​

​(1) 引入依赖​
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

注意版本匹配(Spring Data ES 和 ES 服务端版本需兼容)。

​(2) 实体类映射​

用注解定义 ES 索引结构和分词器:

@Document(indexName = "products", createIndex = false)
public class Product {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word") // 中文分词private String name;@Field(type = FieldType.Double)private Double price;
}
​(3) 混合查询策略​

​写操作​​:双写 MySQL 和 ES(本地事务+消息队列补偿)

@Transactional
public void addProduct(Product product) {// 1. 写入 MySQLproductMapper.insert(product); // 2. 发MQ消息异步写入ES(防止事务失败污染ES)rocketMQTemplate.send("es-update-topic", product);
}

​读操作​​:走 ES 查询,兜底查 MySQL

public Page<Product> search(String keyword, int page, int size) {NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("name", keyword)) // 分词匹配.withPageable(PageRequest.of(page, size)).build();return elasticsearchRestTemplate.search(query, Product.class);
}

​4. 性能对比​

压测结果(100万数据,并发 200):

查询类型MySQL + MPES
单字段精确查询120ms15ms(↑8倍)
多字段模糊查询2800ms(全表扫)50ms(↑56倍)
排序分页900ms30ms(↑30倍)

代价:ES 索引延迟约 1s(近实时),存储占用是 MySQL 的 2 倍。


​5. 深度踩坑​

  1. ​分词器选型​​:默认分词器对中文不友好,需安装 ik 插件
  2. ​数据同步一致性​​:双写时用 canal 监听 MySQL Binlog 更可靠
  3. ​ES 动态映射陷阱​​:字段类型自动推断可能导致查询异常,建议预定义 mapping

​总结​​:

  • ​简单 CRUD​​:继续用 MyBatis-Plus,别过度设计
  • ​复杂搜索/聚合​​:ES 是真香,但要做好​​资源隔离+监控​​(ES 吃内存大户!)
  • ​混合架构​​:学会在不同场景选择合适工具,​​没有银弹​

相关文章:

《从 MyBatis-Plus 到 Elasticsearch:一个后端的性能优化踩坑实录》

​ 最近接手了一个老项目&#xff0c;单表查询用 MyBatis-Plus 写得飞起&#xff0c;但一到​​多表关联模糊搜索​​就卡成 PPT。痛定思痛&#xff0c;决定引入 Elasticsearch 优化查询性能&#xff0c;结果踩坑无数……记录下这次​​从 ORM 到搜索引擎​​的升级历程&#…...

docker 常用指令整理

以下是Docker常用操作指令的整理&#xff0c;分为镜像管理、容器操作、网络配置、数据卷管理、Docker Compose及系统维护等部分&#xff1a; 一、镜像管理 拉取镜像 docker pull [镜像名]:[标签] # 默认标签为latest # 示例&#xff1a;拉取Ubuntu 20.04镜像 docker pull ubun…...

密码格式校验c#和js两种

if (!IsValidPassword(xinmima)) { //在前端校验过了,这里不需要 ClientScript.RegisterStartupScript(GetType(), "", "alert(新密码必须至少8位,且至少包含大写字母、小写字母、数字、特殊符号中的3种)", true); } /// <summary> …...

线程控制

POSIX线程库 与线程有关的函数构成了⼀个完整的系列&#xff0c;绝⼤多数函数的名字都是以“pthread_”打头的要使⽤这些函数库&#xff0c;要通过引入头文件<pthread.h>链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项 eg: g -o $ $^ -lpthread这个pthread库…...

WebView 与 JavaScript 的交互

从技术深度、安全意识 和 实战经验来介绍。以下是分层次的回答策略&#xff0c;从基础到高级逐步深入&#xff1a; 1. 基础实现 回答要点&#xff1a; "Android 和 JavaScript 的交互主要通过 WebView 的两种方式实现&#xff1a; Android 调用 JS&#xff1a; kotlin we…...

解决word中公式大小不一问题

文章目录 前言一、初见端倪二、解决方法三、题外话 前言 记录一下在 word 中使用 mathtype 编辑公式时出现的公式字体大小不一的问题的解决方法。 一、初见端倪 最近在 word 中使用 mathtype 进行公式编辑&#xff0c;刚开始编辑的公式并没有什么问题&#xff0c;过了几天后再…...

Haply与PickNik合作:Inverse3三轴力反馈控制器集成MoveIt Pro,提升机器人操作精度

Haply Robotics与PickNik Robotics合作&#xff0c;将Inverse3力反馈控制器集成到MoveIt Pro平台&#xff0c;优化人机交互&#xff0c;提升机器人操作精度。实时力反馈技术使操作者感知机器人与环境的交互力&#xff0c;增强远程操作的精确度和灵敏度&#xff0c;推动机器人技…...

【Linux笔记】文件的传输(scp、rsync、归档、压缩)

一、sshd 1、概念 在Linux系统中&#xff0c;文件传输常依赖于SSH协议&#xff08;Secure Shell&#xff09;&#xff0c;而sshd&#xff08;OpenSSH Daemon&#xff09;是负责处理SSH连接的后台服务程序。通过sshd&#xff0c;用户可以在加密的通道中进行安全的远程登录、命…...

单位矩阵的特点

《单位矩阵的特性与重要性质》 单位矩阵是一种特殊的方阵&#xff0c;具有以下特点&#xff1a; 主对角线元素全为 1&#xff1a;单位矩阵 I n I_n In​是一个 n n n\times n nn的方阵&#xff0c;其主对角线&#xff08;从左上角到右下角的对角线&#xff09;上的元素均为 …...

AI处理漫画转视频

AI处理漫画转视频 第一步 从漫画PDF文件读取图片 第二部 图片信息剪裁 第三步 OCR识别处理图片&#xff0c;获取漫画对应的文本信息 第四步 运用阿里云通义大模型千文处理提取的文本信息更符合文本语言 第五步 运用FishVideo大模型将文本信息转变为对应的语音 第六步 图片转视…...

三维空间中的离散曲线段匹配方法

基于离散 F r e ˊ c h e t Fr\{e}chet Freˊchet距离实现工程中的三维曲线段匹配 在自动驾驶系统中, 准确匹配相邻车道线是实现安全导航, 变道决策和路径规划的核心任务. 由于道路网络存在交叉口, 弯道, 多车道并行等复杂场景, 如何衡量目标车道曲线与其他候选车道线的空间关…...

HTML的Canvas元素

<Canvas>元素 <Canvas>元素是HTML5引入的一个强大的绘图元素&#xff0c;它允许通过 JavaScript 在网页上动态绘制图形、动画和交互式内容。需要注意的是&#xff0c;<Canvas>元素只是图形的一个容器&#xff0c;绘制图形必须使用Javascript。 空画布 <…...

Django学习记录-2-数据库

Django学习记录-2-数据库 文章目录 Django学习记录-2-数据库参考贴连接数据库后台查看数据库后台改为中文 table增删改查Python使用hash保持一致 虽然网上教程都很多&#xff0c;但是感觉自己记录一下才属于自己&#xff0c;之后想找也方面一点&#xff0c;文采不佳看的不爽可绕…...

qq邮箱群发程序

1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击&#xff0c;进入UI编辑界面&#xff1a; 点击第三步后进入QT的UI设计界面&#xff0c;通过点击按钮进行界面设计&#xff0c;设计后进行保存到当前Pycharm…...

spring mvc 中 RestTemplate 全面详解及示例

RestTemplate 全面详解及示例 1. RestTemplate 简介 定义&#xff1a;Spring 提供的同步 HTTP 客户端&#xff0c;支持多种 HTTP 方法&#xff08;GET/POST/PUT/DELETE 等&#xff09;&#xff0c;用于调用 RESTful API。核心特性&#xff1a; 支持请求头、请求体、URI 参数的…...

openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0

openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0 1、配置 yum 华为源2、安装依赖3、源码安装 openssl 1.0.1u3.1、openssl 1.1.1 降级到 openssl 1.0.1 4、源码安装 python 2.75、使用 pip3 安装 Python 相关依赖6、编译安装 Greenplum-db 6.20.06.1、修改配置6.2、基于…...

天锐蓝盾多模式加密技术,构筑企业数据安全堡垒

一旦企业发生数据泄露&#xff0c;将遭受严重的经济损失&#xff0c;声誉也会一落千丈&#xff0c;甚至可能在激烈的竞争中陷入绝境。那么&#xff0c;企业究竟该如何守护敏感数据&#xff0c;筑牢数据安全的 “护城河” 呢&#xff1f;天锐蓝盾数据泄露防护系统给出了全面且专…...

可编辑37页PPT | 建筑行业DeepSeek日常实操培训

荐言摘要&#xff1a;随着人工智能技术的快速发展&#xff0c;DeepSeek作为一款具有创新性的AI工具&#xff0c;正逐步渗透到建筑行业的各个环节。为帮助建筑行业从业者掌握DeepSeek的核心功能与应用技巧&#xff0c;提升工作效率与决策能力&#xff0c;特推出本次建筑行业Deep…...

C语言指针和函数

文章目录 C语言指针和函数一、指针与函数1.传递指针给函数2.指针函数3.函数指针4.回调函数 二、多级指针三、空指针四、野指针 C语言指针和函数 在C语言的编程领域中&#xff0c;指针是一把强大而又危险的“双刃剑”。它不仅能够直接操作内存&#xff0c;提升程序的运行效率&a…...

左右开弓策略思路

一、策略概述 本策略是一种基于多种技术指标的复杂交易策略&#xff0c;包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现&#xff0c;旨在通过分析历史价格数据来预测未来价格走势&#xff0c;并据此生成交易信号。 二、主要技术指标…...

mapbox基础,加载F4Map二维地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...

doxygen自动生成文档,注释容易错位的补充

开发过程中&#xff0c;为了简化api开发文档的编写工作&#xff0c;我们可以使用doxygen的标注来进行文档注释&#xff0c;最后自动化的生成相关文档&#xff1a; 参考&#xff1a;https://developer.aliyun.com/article/935529 参考&#xff1a;https://blog.csdn.net/qq_3459…...

git操作0409

git init git add. git commit -m "Initial commit" git checkout 7890abc # 切换到旧版本代码&#xff08;只读&#xff09; git checkout master # 切回最新版本 git checkout -b new_branch 789abcd # 或 git checkout -b new_branch HEAD~3 很重点 git reflog …...

电阻的额定功率与额定电压详解

一、基本定义 额定功率&#xff08;Rated Power&#xff09; 定义&#xff1a;电阻在长期安全工作时允许消耗的最大功率&#xff0c;超过此值可能导致过热甚至烧毁。 公式&#xff1a; P I R 或 P V / R &#xff08;I&#xff1a;电流&#xff0c;V&#xff1a;电压&#…...

【后端开发】SpringBoot与Spring MVC

文章目录 创建项目目录介绍Spring MVCservletMVCSpring MVCSpringboot与Spring MVC的区别Spring MVC交互 创建项目 新建一个Springboot项目 对应描述 目录介绍 src/main/java&#xff1a;Java 源代码 src/main/resources&#xff1a;为静态资源或配置⽂件&#xff1a; ----…...

如何禁用 PyCharm 的测试功能

如何禁用 PyCharm 的测试功能&#xff1f; PyCharm 的测试功能默认会自动检测项目中符合命名规则的测试文件&#xff08;如以 test_ 开头的文件&#xff09;并关联测试框架。若需禁用该功能&#xff0c;可通过以下方法操作&#xff1a; 方法一&#xff1a;全局禁用默认测试框架…...

【Spiffo】光速项目:LVGL v9框架下的MIPI简易相机_Part2

简介 本期接上回的工程部署讲一下整个工程的框架逻辑以及相关的模块作用机制&#xff0c;包括mipi抓图像以及后续传递到显示屏的链路逻辑等。 一、核心逻辑 1、如何抓到图像数据并显示 首先能够从摄像头捕获画面并显示是一个相机最起码要能实现的功能。所以先要搞清楚整个链…...

pycharm编译部署智能合约(solcx与web3搭配)

solcx 是一个 python 库,提供了 solidity 编译器的 python 绑定。它使开发者能够直接从 python 中编译 solidity 源代码,生成以太坊智能合约的字节码(Bytecode)和 ABI(Application Binary Interface)。这个库通常用于与 Web3 库配合使用,帮助开发者进行智能合约的部署、…...

微信小程序中的openid的作用

微信小程序中的openid的作用 引言 在当今数字化时代&#xff0c;用户体验成为了产品成功与否的关键因素之一。微信小程序作为连接用户与服务的重要桥梁&#xff0c;在提升用户体验方面发挥着重要作用。其中&#xff0c; openid&#xff08;开放身份标识符&#xff09;是微信小…...

AAAI 2025新研究!大语言模型+MARL=论文新思路?

最新研究显示&#xff0c;多智能体强化学习&#xff08;MARL&#xff09;正迎来一系列技术革新&#xff0c;让AI系统真正具备“群体智能”。同济大学团队提出的动态图通信网络&#xff08;TGCNet&#xff09;&#xff0c;通过Transformer建模智能体间的动态协作关系&#xff0c…...

旅行世界宠物养殖合成游戏源码

旅行世界宠物养殖合成游戏源码&#xff0c;游戏养成类系统&#xff0c;用户能够通过养狗和参加其他活动获取算力&#xff0c;每日任务不断更新&#xff0c;完结即可收取算力&#xff0c;算力能够兑换现金红包。 邀请好友得两级活跃收益提成&#xff0c;徒弟B100.%&#xff0c;徒…...

列表之链表_C

数据结构&#xff08;邓俊辉&#xff09;&#xff1a;列表及相关概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定义Rank类型为int typedef int Rank;// 定义ListNode结构体 typedef struct ListNode {int data;struct ListNode* pred;st…...

图解Java设计模式

1、设计模式面试题 2、设计模式的重要性 3、7大设计原则介绍...

CCF GESP Python编程 四级认证真题 2025年3月

Python 四级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C B C D C A A D B D A C B C 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 2025年春节有两件轰动全球的事件&#xff0c;一个是DeepSeek横空出世&#xff0c;另一个是…...

2025最新系统 Git 教程(四)

2.6 Git 基础 - 打标签 打标签 像其他版本控制系统&#xff08;VCS&#xff09;一样&#xff0c;Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点&#xff08; v1.0 、 v2.0 等等&#xff09;。 在本节中…...

数学知识——欧拉函数

欧拉函数 1 ∼ N 1∼N 1∼N 中与 N N N互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ ( N ) \phi(N) ϕ(N)。 欧拉函数 对于 N p 1 α 1 p 2 α 2 p 3 α 3 . . . p k α k Np_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}...p_k^{\alpha_k} Np1α1​​p2α2​​p3α3​​…...

Dify 识别 “subject“ and “intention“ 的提示词

Dify 识别 "subject" and "intention" 的提示词 内容如下&#xff1a; You need to decompose the users input into "subject" and "intention" in order to accurately figure out what the users input language actually is. Not…...

Hi168云平台部署Ansible学习环境

前言 之前发布的文章已经介绍过了在Hi168云平台部署openEuler学习环境&#xff0c;那么既然能部署openEuler了&#xff0c;其他的各类学习环境自然也就可以部署了。 Ansible简介 Ansible 是一个运维自动化工具&#xff0c;可以通过 SSH 协议对远程主机进行管理&#xff0c;对…...

Anacond虚拟环境里安装GPU版本Pytorch

CUDA/cudnn/CUDAToolkit简单区分 pytorch与cuda关系简单介绍 pytorch是一个深度学习的框架&#xff0c;能够调用cuda进行gpu加速。一般来说你的电脑里是有相关cuda的驱动的&#xff08;可用nvidia-smi命令验证&#xff0c;能运行就说明有&#xff0c;不能运行去搜索安装&#…...

FRP的proxies只是建立通道,相当于建立与服务器沟通的不同通道而不是直接将路由器与服务器云端沟通

没有更好的办法了吗&#xff0c;我看frpc.toml的里面可以设置两个proxies那我esp32的监听端口设置在frpc.toml里面它不也能跟云服务器建立联系吗&#xff0c;比如远程与本地端口都配置为5112那云服务器接收到的5112访问会以frp配置的本地端口5112转发到frp客户端的路由器&#…...

Android开发鸿蒙环境问题记录

Android开发鸿蒙环境问题记录 &#xff08;用于记录开发中鸿蒙环境差异及问题&#xff0c;持续更新&#xff09; 2025.4.9 问题 使用android.intent.action.TIME_TICK广播时&#xff0c;动态注册在鸿蒙4.0系统正常&#xff0c;但在鸿蒙3.0系统无法接收广播。 解决方案 在An…...

在 WSL2的 Ubuntu 20.04 中安装 Docker

WSL1升级到WSL2参考&#xff1a;WSL1升级到WSL2注意事项-CSDN博客 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade -y sudo apt upgrade -y 是 Ubuntu/Debian Linux 系统中的一条命令&#xff0c;用于升级所有已安装的软…...

LeetCode 252 会议室题全解析:Swift 实现 + 场景还原

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在这篇文章中&#xff0c;我们将深入探讨LeetCode第252题“会议室”的问题&#xff0c;提供一个用Swift编写的解决方案&#xff0c;并结合实际场景进行分析。通过这篇文章&#xff0c;你将…...

Postman的内网使用教程

在软件开发和测试过程中&#xff0c;接口测试是确保系统间通信正常的重要环节。当处于内网环境&#xff0c;无法直接访问外网资源时&#xff0c;如何高效地使用Postman进行接口测试也逐渐成为许多开发者关心的问题。 前期准备 安装Postman 从官方网站下载并安装最新版本的Pos…...

【软件测试】Postman中如何搭建Mock服务

在 Postman 中&#xff0c;Mock 服务是一项非常有用的功能&#xff0c;允许你在没有实际后端服务器的情况下模拟 API 响应。通过创建 Mock 服务&#xff0c;你可以在开发阶段或测试中模拟 API 的行为&#xff0c;帮助团队成员进行前端开发、API 测试和集成测试等工作。 Mock 服…...

【NLP 57、LLM通用能力评价方式】

人生如题&#xff0c;放下&#xff0c;是最优雅的解法 —— 25.4.9 目前&#xff0c;我们通过一些特殊的“集合”来评价大语言模型效果 一、MMLU 集合 测量大规模多任务语言理解 评估模型在57个学科领域的综合知识理解能力&#xff0c;覆盖人文、社科、STEM&…...

centos7.9升级OpenSSL 1.1.1

centos7.9升级openssl 人工智能已经很准了&#xff1a; 问题&#xff1a; [rootcentos01 ~]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 [rootcentos01 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要升级OpenSSL&#xff0c;请给出具体…...

10A 大电流 DCDC 降流芯片 WD5030

10A 大电流 DCDC 降压芯片 WD5030 在电子设备的电源管理领域&#xff0c;高效稳定的 DCDC 芯片至关重要。今天我们来深入探讨一款性能卓越的 10A 大电流 DCDC 降流芯片 ——WD5030。它在众多电子应用场景中展现出了强大的优势&#xff0c;为各类设备的稳定供电提供了可靠保障。…...

# 基于BERT的文本分类

基于BERT的文本分类项目的实现 一、项目背景 该文本分类项目主要是情感分析&#xff0c;二分类问题&#xff0c;以下是大致流程及部分代码示例&#xff1a; 二、数据集介绍 2.1 数据集基本信息 数据集自定义类型二分类&#xff08;正面/负面&#xff09;样本量训练集 验证…...

Verilog学习-1.模块的结构

module aoi(a,b,c,d,f);/*模块名为aoi&#xff0c;端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...