摘要:做 Java 开发 8 年,接触过 Hibernate、JPA、MyBatis,到现在主力框架 MyBatis Plus(简称 MP)。一路踩坑无数,从最初写死 SQL 到现在用 Lambda 链式操作,感触最深的是:CRUD 看似简单,数据量一大,性能问题就
做 Java 开发 8 年,接触过 Hibernate、JPA、MyBatis,到现在主力框架 MyBatis Plus(简称 MP)。一路踩坑无数,从最初写死 SQL 到现在用 Lambda 链式操作,感触最深的是:CRUD 看似简单,数据量一大,性能问题就来了。
最近负责的一个项目,数据库表量级破千万,每次执行 CRUD 都像走钢丝,稍有不慎就引起数据库报警。本文就结合这个项目的实战经验,聊聊 MyBatis Plus 在千万级数据场景下如何优化 CRUD 操作 。
MP 是 MyBatis 的增强工具,主打“ 无侵入、低门槛、强增强 ”,提供了一整套优雅的 CRUD 封装,尤其适合中后台系统的开发。
但性能优化这件事,MP 提供了钩子,还得靠我们自己去掌握底层逻辑与场景判断 。
当数据达到千万级时,常见的问题有:
• 查询慢、分页卡顿• 更新/删除误操作影响大• 数据迁移困难• 索引策略不合理• 乐观锁/悲观锁未启用带来并发问题Page page = new Page(1, 10);IPage result = userMapper.selectPage(page, new QueryWrapper .eq("status", "active") .orderByDesc("create_time"));优化点:
QueryWrapper wrapper = new QueryWrapper;wrapper.lt("id", lastId) .orderByDesc("id") .last("limit 100");List users = userMapper.selectList(wrapper);比传统 OFFSET 分页快得多,适合批量导出或加载。
List userList = new ArrayList;for (int i = 0; i建议:
• 单次批量插入控制在 1000 条以内,避免 SQL 超长• 使用原生 JDBC 批处理,性能更优错误:
userMapper.update(null, new UpdateWrapper.set("status", "inactive"));优化:
UpdateWrapper wrapper = new UpdateWrapper;wrapper.eq("status", "active");wrapper.set("status", "inactive");userMapper.update(null, wrapper);永远记住: Update 要加条件!
@TableField(fill = FieldFill.UPDATE)@Versionprivate Integer version;user.setVersion(3);userMapper.updateById(user); // MP 会自动加 version 判断@TableLogicprivate Integer isDeleted;userMapper.deleteById(123L); // 实际执行的是 UPDATE 操作逻辑删除的优势:
• 避免误删• 保留数据审计• 与回收站机制兼容注意:逻辑删除字段要加索引!
在千万级数据场景,批处理 + 异步化 是性能优化的核心手段:
• 使用 Stream 分批处理大数据集合• 配合 Spring Batch 或自定义线程池实现异步任务• 使用定时任务(如 XXL-JOB )分时段处理数据MyBatis Plus 提供了优雅的接口,但数据量上来之后,框架只是工具,根本还在底层 SQL 和设计策略上 。
作为一个写了 8 年 Java 的程序员,我最大的体会是:
性能不是调出来的,是设计出来的。
合理建模 + 规范使用 MP + 数据库调优,才能让你的系统在千万级数据面前从容应对。
转 自:juejin.cn/post/7519786744259723300
后端专属技术群 构建高质量的技术交流社群,欢迎从事编程开发、技术招聘 HR 进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以 交流技术 、 职位内推 、 行业探讨 为主
来源:墨码行者