MyBatis Plus 如何优化千万级数据的 CRUD?

SpringBoot整合MyBatis-Plus:零XML实现高效CRUD 作为一名开发者,数据库操作是我们日常工作中不可或缺的部分。传统的MyBatis虽然强大,但需要编写大量XML映射文件,这在快速开发的今天显得效率不足。MyBatis-Plus(简称MP)作为MyBatis的增强工具,在保留MyBatis所有特性的基础上,极大地简化了开发流程。本文将带你全面了解如何在SpringBoot项目中整合MyBatis-Plus,实现零XML配置的高效CRUD操作。特性JPAMyBatisORM支持全自动ORM半自动ORMMyBatis增强SQL控制。 阅读详情

背景

做 Java 开发 8 年,接触过 Hibernate、JPA、MyBatis,到现在主力框架 MyBatis Plus(简称 MP)。一路踩坑无数,从最初写死 SQL 到现在用 Lambda 链式操作,感触最深的是:CRUD 看似简单,数据量一大,性能问题就来了。

最近负责的一个项目,数据库表量级破千万,每次执行 CRUD 都像走钢丝,稍有不慎就引起数据库报警。本文就结合这个项目的实战经验,聊聊 MyBatis Plus 在千万级数据场景下如何优化 CRUD 操作。


一、MyBatis Plus 简介

MP 是 MyBatis 的增强工具,主打“无侵入、低门槛、强增强”,提供了一整套优雅的 CRUD 封装,尤其适合中后台系统的开发。

但性能优化这件事,MP 提供了钩子,还得靠我们自己去掌握底层逻辑与场景判断。


二、千万级数据的挑战

当数据达到千万级时,常见的问题有:

  • 查询慢、分页卡顿
  • 更新/删除误操作影响大
  • 数据迁移困难
  • 索引策略不合理
  • 乐观锁/悲观锁未启用带来并发问题

三、优化 CRUD 的关键策略

下面我从 增、删、改、查 四个维度,结合 MP 的用法,逐一拆解优化策略。


1.查询优化(Select)

✅ 使用分页插件 + 索引优化

Page<User> page = new Page<>(1, 10);
IPage<User> result = userMapper.selectPage(page, new QueryWrapper<User>()
        .eq("status", "active")
        .orderByDesc("create_time"));

优化点:

  • 创建复合索引 (status, create_time),避免文件排序
  • 设置合理的 limit 范围,避开深分页(推荐游标分页)

✅ 游标分页(Keyset Pagination)案例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("id", lastId)
       .orderByDesc("id")
       .last("limit 100");

List<User> users = userMapper.selectList(wrapper);

比传统 OFFSET 分页快得多,适合批量导出或加载。


2.插入优化(Insert)

✅ 批量插入代替单条插入

List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    userList.add(new User("user" + i));
}
userMapper.insertBatchSomeColumn(userList); // 需自定义方法或 MyBatis 扩展

建议:

  • 单次批量插入控制在 1000 条以内,避免 SQL 超长
  • 使用原生 JDBC 批处理,性能更优

3.更新优化(Update)

✅ 避免全表更新

错误:

userMapper.update(null, new UpdateWrapper<User>().set("status", "inactive"));

优化:

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("status", "active");
wrapper.set("status", "inactive");
userMapper.update(null, wrapper);

永远记住:Update 要加条件!

✅ 乐观锁控制并发更新

@TableField(fill = FieldFill.UPDATE)
@Version
private Integer version;
user.setVersion(3);
userMapper.updateById(user); // MP 会自动加 version 判断

4.删除优化(Delete)

✅ 逻辑删除替代物理删除

@TableLogic
private Integer isDeleted;
userMapper.deleteById(123L); // 实际执行的是 UPDATE 操作

逻辑删除的优势:

  • 避免误删
  • 保留数据审计
  • 与回收站机制兼容

注意:逻辑删除字段要加索引!


四、批处理与异步处理

在千万级数据场景,批处理 + 异步化 是性能优化的核心手段:

  • 使用 Stream 分批处理大数据集合
  • 配合 Spring Batch 或自定义线程池实现异步任务
  • 使用定时任务(如 XXL-JOB)分时段处理数据

五、数据库层面的优化建议

  • 合理建索引(避免过多/重复索引)
  • 垂直/水平分表(ShardingSphere、MyCat)
  • 使用中间件缓存热点数据(Redis)
  • 慎用视图和子查询,优先考虑 JOIN 重构

六、总结:CRUD 优化是一场系统工程

MyBatis Plus 提供了优雅的接口,但数据量上来之后,框架只是工具,根本还在底层 SQL 和设计策略上。

作为一个写了 8 年 Java 的程序员,我最大的体会是:

性能不是调出来的,是设计出来的。

合理建模 + 规范使用 MP + 数据库调优,才能让你的系统在千万级数据面前从容应对。

MyBatis与MyBatis-Plus实战指南 本文是一份MyBatis与MyBatis-Plus的完整开发指南,主要涵盖以下内容: 框架对比:MyBatis提供灵活SQL映射能力,适合复杂查询;MyBatis-Plus作为增强工具,简化单表CRUD操作,提高开发效率。 核心功能详解: MyBatis基础:配置、Mapper接口、动态SQL、结果映射 MyBatis-Plus特性:通用Mapper/Service、条件构造器、代码生成器、主键策略 高级特性:分页插件、乐观锁、逻辑删除、动态表名、枚举处理等 整合实践:与SpringBoot的集成方式及事务 阅读详情

相关推荐

极空间NAS零基础部署Wiki.js:Docker+PostgreSQL全流程避坑指南

本文提供了一份在极空间NAS上从零部署Wiki.js私有知识库的详细指南。通过Docker容器化技术,结合PostgreSQL数据库,手把手讲解环境准备、核心组件配置、性能优化及安全加固等全流程,并特别针对极空间平台特性提供了避坑要点,帮助用户打造安全、高效、自主可控的知识管理系统。

3a9bq4r8t2y的博客 486

Mybatis批量更新优化方案

今天在对接客户接口的时候,对方同步数据到我们系统,涉及到数据批量更新,插入的逻辑,出于性能方面的考虑,决定对自己写的逻辑进行优化,下面对几种优化方案进行总结。使用mybatisplus的saveOrUpdateBatch操作效率极低,查看sql日志可以发现,实际上还是一条一条插入的,而且在插入之前还要查询数据库是否存在该数据,耗时很久,建议不要使用。优化方案一是多条sql语句,需要数据库执行多次修改操作,而优化方案二是一条sql语句,只需要数据库执行一次修改操作。

lianaozhe的博客 7561

从零开始:用RFSOC XCZU47DR搭建软件无线电开发环境(2023最新版)

本文详细介绍了如何使用Xilinx RFSoC XCZU47DR搭建高性能软件无线电(SDR)开发环境,涵盖硬件选型、开发环境配置、射频子系统校准及实战应用开发。特别针对2023年最新技术需求,提供从基础配置到高级优化的完整指南,助力科研人员和工程师快速掌握RFSoC开发技术。

weixin_42525005的博客 512

mybatis数据批量更新

数据批量更新

xieqj_0511的博客 1万+

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

详解各类以太网标准10BASE-T/100BASE-T4/100BASE-FX/1000BASE-X等

以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。经典以太网是以太网的原始形式,运行速度从3-10 Mbps不等;而交换式以太网正是广泛应用的以太网,可运行在100Mbps、1000Mbps和10000Mbps高速率,分别以快速以太网、千兆以太网和万兆以太网的形式呈现

不积跬步,无以至千里! 5万+

批量插入或更新数据(MyBatis-plus框架)

插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新需求:根据表中的部分字段去判断插入或者更新有一张表 hh_adx_monitor_summary需要通过code,plan_id,dimension_time判断插入或者更新此时会发现依然会重复插入数据,需要创建一个组合索引添加完索引再次尝试,code,plan_id,dimension_time相同的情况下只会更新不会新增。

hauchun的博客 6万+

GPU运维面试题

【代码】GPU运维面试题。

u011220233的博客 698

关于mybatis plus 中的查询优化

传统的mybatis plus 查询写法 对于常规的mybatis单表查询,我们既可以采用LambdaQueryWrapper查询,也可以使用QueryWrapper查询。 LambdaQueryWrapper具有防误写、规范代码等好处,但是缺点是无法在复杂的多表查询中使用。 相比较来说,使用QueryWrapper编写查询更加灵活,可以适应更复杂的查询场景。 我们首先看一个QueryWrapper查询的例子 public List<UserMo> list (UserForm userF

湖南长城科技的博客 2228

漏检率从23%降至1.3%:YOLOv8交通车辆计数与违章识别完整落地方案

本文分享了基于YOLOv8+ByteTrack的交通视频分析系统实战经验,针对车辆计数和违章识别两大核心功能,提出了完整的工程化解决方案。系统采用边缘计算架构,单张GTX 1660即可稳定处理8路1080P视频流,实现了白天98.7%、夜间96%以上的车辆计数准确率。文章详细剖析了交通视频分析的四大落地痛点,系统架构设计思路,以及遮挡处理、光照适应、多路并发等关键技术优化方案,重点介绍了车辆计数三重校验机制和三类违章识别的工程实现细节。通过ROI裁剪、TensorRT加速、动态抽帧等优化手段,显著提升了系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 340

RDKit | 基于Pytorch和RDKit建立QSAR模型

QSAR 定量构效方法(quantitative structure-activity relationship, QSAR)是应用最为广泛的药物设计方法。所谓定量构效方法就是通过一些数理统计方法建立其一系列化合物的生理活性或某种性质与其物理化学性质之间的定量关系,通过这些定量关系。可以预测化合物的生理活性或某些性质,指导我们设计出具有更高活性的化合物。 早在...

DrugOne 5078

Mybatis/Mybatis-Plus 使用流式查询优化大量数据导出

前言 相信小伙伴们工作当中肯定会经常遇到导出数据的需求,做这个导出需求的话相信大家肯定很多人用easypoi工具包,这个工具包用起来是真的方便,爽。但是如果数据量大,产品又要你导出很多数据,这时候就不爽了,因为如果数据量大的话,服务器配置又不是很高,那么很容易就把服务器导挂了。今天就教大家一招(有能力的小伙伴也可以自行研究使用其它方式优化导出),使用mybatis/mybatis-plus中的流式查询结合阿里的easyexcel做到一边查询一边写入流的方式优化大量数据导出,这样做写入流后的数据内存就可

Dream_xun的专栏 1万+

2万字大厂面经:小米嵌入式面试题及参考答案(持续更新)

BIOS (Basic Input/Output System) 是一种存储在ROM中的固件程序,它为计算机提供了最基础的硬件初始化和服务。BIOS主要存在于传统的x86架构计算机中。嵌入式系统的启动流程取决于具体的硬件平台和所采用的操作系统。复位阶段:当系统通电或复位时,CPU进入复位状态。硬件初始化:CPU和必要的硬件设备(如内存控制器)被初始化。加载引导加载程序:引导加载程序(如U-Boot)被加载到内存中。执行引导加载程序:引导加载程序开始执行,初始化更多的硬件设备,并检测存储介质。

大模型大数据攻城狮的专栏 2529

MyBatis Plus 如何优化千万级数据的 CRUD

MP 是 MyBatis 的增强工具,主打“无侵入、低门槛、强增强”,提供了一整套优雅的 CRUD 封装,尤其适合中后台系统的开发。但性能优化这件事,MP 提供了钩子,还得靠我们自己去掌握底层逻辑与场景判断。MyBatis Plus 提供了优雅的接口,但数据量上来之后,框架只是工具,根本还在底层 SQL 和设计策略上。性能不是调出来的,是设计出来的。合理建模 + 规范使用 MP + 数据库调优,才能让你的系统在千万级数据面前从容应对。

2501_92608043的博客 688

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【MyBatis-Plus】MyBatis进阶使用

MyBatis-Plus 是一个的增强工具,在 MyBatis 的基础上只做增强不做改变(也就是说mybatis有的plus都有),为简化开发、提高效率而生。

让优秀成为一种习惯! 4814

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java框架之MyBatis Plus

MyBatis Plus 是一个功能强大且易于使用的数据库访问框架,它不仅简化了 MyBatis 的使用难度,还提供了许多实用的功能。无论是对于新手还是经验丰富的开发者,MyBatis Plus 都是一个值得尝试的选择。通过上述的介绍和代码示例,希望能帮助你更好地理解和使用 MyBatis Plus。

一个老Java开发的自白 1641

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MyBatis-Plus 全解:从高效 CRUD 到云原生数据层架构的艺术

摘要:MyBatis-Plus作为MyBatis的增强工具,通过通用Mapper、条件构造器等功能显著提升开发效率,减少80%的单表操作代码。本文从数据持久层演进切入,分析MyBatis-Plus如何平衡SQL灵活性与开发效率,详细讲解其核心特性与Spring Boot整合实践,包括条件构造器、代码生成等高级用法,并探讨其在云原生场景下的应用。为开发者提供从入门到进阶的完整技术方案。 关键词:MyBatis-Plus、ORM、Spring Boot、条件构造器、云原生

领码SPARK - 以无代码之星火,燎原数字之未来! 2337

MyBatis与MyBatis-Plus的区别?

MyBatis的编程风格更加传统,需要定义mapper.xml文件并根据传入的参数使用相应的SQL查询语句,需要实现 Mybatis 提供的各种方法;而MyBatis-Plus是在MyBatis框架上的封装,通过对于增强简化后的API更加方便地进行开发,并且在性能、效率和易用性上都有一定的优化。MyBatis-Plus相比于MyBatis提供了很多额外的功能,例如像条件构造器、代码生成器、分页插件、性能分析拦截器等实用的组件,使得开发者可以轻松快速完成业务逻辑的开发。

jakelihua 2万+

MyBatis-Plus性能优化:千万级数据查询提速3倍(避坑3个高频错误)

本文针对MyBatis-Plus在千万级数据场景下的性能瓶颈,提出四维优化方案:通过索引优化(避免全表扫描)、分页与批量查询(控制内存负载)、SQL优化(精简查询字段与关联查询)、合理配置连接池,实现查询性能提升3倍以上。重点包括:条件构造器适配索引技巧、物理分页配置、分段批量查询策略、JOIN替代嵌套查询等实战方法。方案基于MyBatis-Plus 3.5.5+和MySQL 8.0验证,可有效解决查询缓慢、内存溢出等问题,适用于高并发大数据量场景。

2601_94871597的博客 924

MyBatis-Plus:简化 CRUD 操作的艺术

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。

qq_17153885的博客 1084
上一篇: 如何实现分库分表后的全局唯一 ID?
下一篇: 直播系统如何设计高并发推流与拉流架构?
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值