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

告别先查后改!用MyBatis-Plus-Plus实现复合主键批量更新,性能提升实测

告别先查后改用MyBatis-Plus-Plus实现复合主键批量更新性能提升实测在数据密集型应用中批量更新操作往往是性能瓶颈所在。当数据量达到万级甚至十万级时传统的先查询再修改模式会带来巨大的数据库压力。本文将深入探讨如何利用MyBatis-Plus-Plus简称MPP的复合主键功能实现高效的批量更新操作并通过实测数据展示性能提升效果。1. 复合主键的应用场景与优势在处理用户行为日志、交易记录等业务场景时单一自增ID往往无法满足业务需求。以用户观看视频时长记录为例典型的业务主键组合是用户ID视频ID。传统方案的痛点需要先通过业务字段查询出记录ID批量更新时需要执行多次查询操作分表架构下查询开销成倍增加复合主键方案的优势直接通过业务字段定位记录减少不必要的查询操作批量更新时SQL更简洁高效提示复合主键特别适合具有明确业务标识字段的场景如订单号商品ID、用户ID资源ID等组合。2. MyBatis-Plus-Plus核心功能解析MPP在MyBatis-Plus基础上扩展了多项实用功能其中对复合主键的支持最为突出。2.1 基础配置首先需要在项目中引入MPP依赖dependency groupIdcom.github.jeffreyning/groupId artifactIdmybatisplus-plus/artifactId version1.5.1-RELEASE/version /dependency同时确保MyBatis-Plus相关依赖版本兼容dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.1.0/version /dependency2.2 实体类定义使用MppMultiId注解标记复合主键字段Data TableName(UserWatchVideoLog) public class UserWatchVideoLogPo implements Serializable { MppMultiId TableField(userId) private Integer userId; MppMultiId TableField(lessonItemId) private Integer lessonItemId; // 其他业务字段... }2.3 核心接口说明MPP提供了专门的接口和实现类支持复合主键操作组件类型基类/接口说明MapperMppBaseMapper扩展了复合主键CRUD操作ServiceIMppService提供复合主键相关Service方法Service实现MppServiceImpl默认实现类3. 批量更新实战3.1 单条记录更新传统方式需要先查询出记录而MPP可以直接通过复合主键更新// 传统方式需要先查询 UserWatchVideoLogPo po mapper.selectOne(queryWrapper); po.setSeconds(newValue); mapper.updateById(po); // MPP直接更新 UserWatchVideoLogPo updatePo new UserWatchVideoLogPo() .setUserId(userId) .setLessonItemId(videoId) .setSeconds(newValue); service.updateByMultiId(updatePo);3.2 批量更新实现MPP提供了updateBatchByMultiId方法实现真正的批量更新ListUserWatchVideoLogPo updateList // 构建更新列表 boolean result service.updateBatchByMultiId(updateList, 1000); // 每批1000条批量更新原理根据复合主键自动生成WHERE条件使用JDBC批量操作减少网络开销支持分批处理避免超大事务3.3 性能对比测试我们在测试环境中对比了三种更新方式的性能更新方式1万条耗时(ms)10万条耗时(ms)CPU占用传统单条更新12,345128,765高传统批量更新8,23489,432中MPP复合主键批量更新2,15621,543低测试环境配置MySQL 8.016核CPU/32GB内存千兆网络4. 高级特性与最佳实践4.1 与分页插件的兼容性MPP优化了分页插件支持在不分页的情况下进行排序PageUserWatchVideoLogPo page new Page(1, -1); // size-1表示不分页 page.addOrder(OrderItem.desc(updateTime)); ListUserWatchVideoLogPo list mapper.selectPage(page, queryWrapper);4.2 自定义字段填充MPP扩展了字段填充功能支持复杂的自定义SQL填充TableField(fill FieldFill.INSERT) InsertFill(SELECT MAX(seq_no)1 FROM order_seq) private Integer seqNo;4.3 分表架构下的注意事项在分表场景中使用复合主键更新时需要确保分片键包含在复合主键中批量更新的记录属于同一分片合理设置批量大小避免跨分片事务5. 常见问题解决方案问题1更新时部分字段被忽略解决方案检查实体类字段是否有TableField注解确认更新方法使用的是updateByMultiId而非普通update问题2批量更新性能不理想优化建议调整批量大小通常500-2000为宜确保复合主键字段有索引考虑使用异步更新机制问题3与MyBatis-Plus原有功能冲突兼容性处理优先使用MPP提供的方法避免混用两种风格的API仔细检查自动生成的SQL在实际项目中我们通过引入MPP的复合主键功能将用户行为日志同步任务的执行时间从原来的30分钟缩短到5分钟以内数据库CPU峰值负载降低了60%。特别是在分表数量达到64个的大规模场景下性能优势更加明显。

相关文章:

告别先查后改!用MyBatis-Plus-Plus实现复合主键批量更新,性能提升实测

告别先查后改!用MyBatis-Plus-Plus实现复合主键批量更新,性能提升实测 在数据密集型应用中,批量更新操作往往是性能瓶颈所在。当数据量达到万级甚至十万级时,传统的"先查询再修改"模式会带来巨大的数据库压力。本文将深…...

别再只盯着Grad-CAM了!用OpenCV的applyColorMap函数,5分钟搞定PyTorch模型的特征图可视化

5分钟实现PyTorch特征图可视化:OpenCV高阶玩法全解析 在调试深度学习模型时,我们常常需要确认模型是否真正"看"到了图像的关键区域。传统方法如Grad-CAM虽然功能强大,但对于快速验证和日常调试来说,往往显得过于笨重。今…...

如何用WinUtil:一键解决Windows系统管理的终极指南

如何用WinUtil:一键解决Windows系统管理的终极指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 还在为Windows系统管理而烦恼吗…...

如何快速解决Windows热键冲突:Hotkey Detective智能检测工具完全指南

如何快速解决Windows热键冲突:Hotkey Detective智能检测工具完全指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective…...

Golang怎么读取环境变量_Golang如何用os.Getenv获取系统环境变量【基础】

os.Getenv读不到变量是因为进程只继承启动时的环境快照,需确认变量已生效;其返回空字符串无法区分“未设置”和“值为空”,应改用os.LookupEnv判断存在性。os.Getenv 读不到变量?先确认它真在进程环境里Go 程序启动时会拷贝父进程…...

抖音下载器完整教程:3分钟掌握免费批量下载技巧

抖音下载器完整教程:3分钟掌握免费批量下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

WaveTools鸣潮工具箱:一键解锁120FPS,打造极致游戏体验的完整指南

WaveTools鸣潮工具箱:一键解锁120FPS,打造极致游戏体验的完整指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源性能优化工具箱&#…...

跨平台游戏模组下载指南:WorkshopDL终极解决方案

跨平台游戏模组下载指南:WorkshopDL终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为GOG或Epic平台购买的游戏无法使用Steam创意工坊模组而烦恼吗…...

终极指南:如何用STB字符串哈希表避开90%的C语言坑

终极指南:如何用STB字符串哈希表避开90%的C语言坑 【免费下载链接】stb stb single-file public domain libraries for C/C 项目地址: https://gitcode.com/GitHub_Trending/st/stb 在C语言开发中,手动管理数据结构往往是错误的重灾区。内存泄漏、…...

MW-N100-NAS主板解析:高性能迷你ITX存储解决方案

1. MW-N100-NAS主板深度解析:专为存储优化的迷你ITX解决方案在构建高性能家庭或小型企业NAS系统时,主板的选择往往成为决定整体性能与扩展性的关键因素。最近市场上出现了一款颇具特色的产品——MW-N100-NAS迷你ITX主板,它搭载了Intel N100 A…...

如何让QuickLook完美支持QOI图像格式快速预览:完整配置指南

如何让QuickLook完美支持QOI图像格式快速预览:完整配置指南 【免费下载链接】QuickLook Bring macOS “Quick Look” feature to Windows 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook QuickLook是一款为Windows系统带来macOS"Quick Look&qu…...

别再只会用convert了!GraphicsMagick这10个隐藏命令,让你批量处理图片效率翻倍

GraphicsMagick高阶技巧:10个被低估的命令让图片处理效率飙升 如果你还在用convert命令处理所有图片任务,那就像用瑞士军刀切牛排——能用,但绝对不够高效。GraphicsMagick作为ImageMagick的轻量化分支,保留了核心功能的同时显著提…...

Headless Service 的 DNS 解析全揭秘:从本地集群到跨集群访问的完整排错手册

Headless Service 的 DNS 解析全揭秘:从本地集群到跨集群访问的完整排错手册 在 Kubernetes 集群中,Headless Service 是一种特殊类型的服务,它为有状态应用提供了直接访问 Pod 的能力。与普通 Service 不同,Headless Service 不分…...

从手机芯片到自动驾驶:算力单位TOPS/MACs/FLOPS是如何影响你每天使用的技术的?

从手机芯片到自动驾驶:算力单位如何塑造你的数字生活? 清晨的闹钟响起时,你拿起手机用面部识别解锁,语音助手根据指令调整空调温度,通勤路上汽车自动保持车道——这些场景背后都有一场看不见的算力博弈。当我们谈论TO…...

Go语言怎么做API限流_Go语言令牌桶限流教程【实战】

Go 推荐用 golang.org/x/time/rate.Limiter 实现令牌桶限流,因其轻量、线程安全、支持突发控制;需复用实例、合理设置 rate 和 burst(如 rate.Every(100ms), burst20),并在路由前统一拦截,避免误用 Allow()…...

终极指南:如何在Remix项目中快速解决Promise异常和错误处理问题

终极指南:如何在Remix项目中快速解决Promise异常和错误处理问题 【免费下载链接】remix Build Better Websites. Create modern, resilient user experiences with web fundamentals. 项目地址: https://gitcode.com/GitHub_Trending/re/remix Remix作为构建…...

如何快速定制Office界面:面向新手的完整指南

如何快速定制Office界面:面向新手的完整指南 【免费下载链接】office-custom-ui-editor Standalone tool to edit custom UI part of Office open document file format 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor Office Custom…...

Bioicons终极指南:3000+免费科研矢量图标如何彻底改变你的科学可视化工作流

Bioicons终极指南:3000免费科研矢量图标如何彻底改变你的科学可视化工作流 【免费下载链接】bioicons A library of free open source icons for science illustrations in biology and chemistry 项目地址: https://gitcode.com/gh_mirrors/bi/bioicons 你是…...

AI工程化设计(五)Agent设计范式(3)Workflow / 状态机

Workflow / 状态机:让 Agent 从“能跑”变成“可控运行”一、介绍1. 什么是 Workflow / 状态机在 Agent 设计中,Workflow / 状态机是一类非常“工程化”的范式。可以用一个直观的对比来理解:ReAct:边查边想Plan-and-Execute&#…...

终极指南:text-generation-webui特殊标签与数学公式完美渲染技巧

终极指南:text-generation-webui特殊标签与数学公式完美渲染技巧 【免费下载链接】textgen The original local LLM interface. Text, vision, tool-calling, training. UI API, 100% offline and private. 项目地址: https://gitcode.com/GitHub_Trending/te/te…...

Go语言的runtime.MemProfile中的分析可视化

Go语言作为一门高效且现代化的编程语言,其内存管理机制一直是开发者关注的焦点。runtime.MemProfile作为Go语言内置的内存分析工具,能够帮助开发者深入了解程序的内存使用情况,而分析可视化则进一步提升了内存问题的诊断效率。本文将围绕runt…...

Oracle数据库里如何给中文做MD5加密?一个函数解决字符集转换的坑

Oracle数据库中文MD5加密的终极解决方案:彻底解决字符集陷阱 当我们在Oracle数据库中处理中文数据时,MD5加密可能会变成一个令人头疼的问题。想象一下这样的场景:你在Oracle中加密了一个中文字符串,然后在Java或Python中加密同样…...

Redis客户端连接监控终极指南:Redisson CLIENT LIST命令深度解析

Redis客户端连接监控终极指南:Redisson CLIENT LIST命令深度解析 【免费下载链接】redisson Redisson - Valkey & Redis Java client. Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: S…...

Qwen3-ASR-1.7B实战:一键部署Web界面,上传音频秒出文字

Qwen3-ASR-1.7B实战:一键部署Web界面,上传音频秒出文字 1. 模型概述与核心能力 Qwen3-ASR-1.7B是阿里云通义千问团队推出的开源语音识别模型,作为ASR系列的高精度版本,在识别准确率和多语言支持方面表现突出。相比前代0.6B版本&…...

保姆级教程:在Ubuntu 20.04上搞定Intel Realsense D435i驱动与ROS Noetic节点(含常见错误排查)

保姆级教程:Ubuntu 20.04 ROS Noetic环境下Intel Realsense D435i全流程配置指南 刚拿到Intel Realsense D435i时,你可能既兴奋又忐忑——这款集成了RGB、深度和IMU的相机能为机器人项目带来无限可能,但驱动安装和ROS集成过程中的各种"…...

终极小米社区自动化任务指南:免费解放双手的完整教程

终极小米社区自动化任务指南:免费解放双手的完整教程 【免费下载链接】miui-auto-tasks 一个自动化完成小米社区任务的脚本 项目地址: https://gitcode.com/gh_mirrors/mi/miui-auto-tasks 小米社区自动化任务工具是一款专为米粉设计的智能脚本,能…...

别再死记硬背了!用Python的combinations函数玩转数据组合,从抽奖到密码生成都能搞定

用Python的combinations函数解锁数据组合的无限可能 在数据处理和分析中,组合操作是一个常见但容易被低估的工具。Python标准库中的itertools.combinations函数提供了一种高效的方式来生成所有可能的组合,而无需手动编写复杂的嵌套循环。这个看似简单的函…...

OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 ‘enu/neu‘ 之谜

OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 enu/neu 之谜 作为一名长期与 WebGIS 打交道的开发者,最近在对接国内天地图服务时,遇到了一个令人抓狂的问题:明明已经按照标准流程注册了 CG…...

Simulink Autosar开发:手把手教你配置PortParameter实现参数通信(附ARXML解析)

Simulink Autosar开发:手把手教你配置PortParameter实现参数通信(附ARXML解析) 在汽车电子软件开发中,AUTOSAR标准已经成为行业通用架构。其中,参数通信机制是软件组件(SWC)间数据交互的核心功能之一。本文将深入探讨基…...

从分页计算到金额处理:盘点C#取整函数在真实项目里的5个高频应用场景

从分页计算到金额处理:C#取整函数的5个实战应用场景 在开发电商后台时,我发现一个有趣的现象:当用户浏览商品列表时,系统显示"共37件商品,每页10条,当前第4页"。这个简单的分页功能背后&#xff…...