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

深入解析rewriteBatchedStatements:如何通过SQL重写提升MySQL批处理性能

1. 揭开rewriteBatchedStatements的神秘面纱第一次听说rewriteBatchedStatements这个参数时我正被一个批量导入数据的性能问题折磨得焦头烂额。当时我们的系统需要每小时处理数十万条用户行为数据但MySQL的插入速度始终上不去。直到某天深夜调试时偶然在JDBC连接字符串中加上了这个参数性能竟然直接提升了5倍这让我意识到很多开发者可能都低估了这个看似简单的配置项的威力。rewriteBatchedStatements是MySQL JDBC驱动中的一个关键参数默认为false。它的核心作用是将批量执行的SQL语句进行智能重写。举个例子当你用addBatch()添加了100条INSERT语句时// 典型批处理代码示例 try (Connection conn dataSource.getConnection(); PreparedStatement pstmt conn.prepareStatement(INSERT INTO user_log VALUES (?,?))) { for (UserAction action : actions) { pstmt.setString(1, action.getUserId()); pstmt.setTimestamp(2, action.getActionTime()); pstmt.addBatch(); } pstmt.executeBatch(); }没有开启参数时驱动会老老实实地向MySQL服务器发送100次独立的INSERT请求产生100次网络往返。开启参数后驱动会将语句重写为INSERT INTO user_log VALUES (v1),(v2)...(v100)这样的多值语法只需一次网络通信就能完成全部操作。这种优化带来的性能提升是惊人的。在我最近的一个压测中批量插入1万条记录的时间从原来的12秒降到了2.3秒。特别是在云数据库场景下网络延迟的影响更为明显这个参数的优化效果会更加显著。2. 深入理解批处理重写机制2.1 驱动层的工作原理要真正用好rewriteBatchedStatements我们需要了解它的底层实现逻辑。通过阅读MySQL Connector/J的源码我发现其核心处理流程在ClientPreparedStatement类中批处理收集阶段调用addBatch()时驱动只是将参数集保存在内存中不会立即构造SQL。执行触发点当executeBatch()被调用时驱动会检查rewriteBatchedStatements标志// 源码中的关键判断逻辑 if (rewriteBatchedStatements batchSize 3) { return executeBatchWithMultiValuesClause(); }SQL重写阶段对于INSERT语句驱动会生成INSERT INTO table VALUES (?,?),(?,?)...这样的预编译语句对于UPDATE/DELETE则采用分号连接的多语句形式。这里有个有趣的细节驱动会智能判断批处理大小太小的批次3不会触发重写因为合并的开销可能抵消不了收益。这也解释了为什么有些开发者测试时发现参数不生效——他们可能只测试了少量数据。2.2 支持的语句类型不是所有SQL都能享受重写优化目前驱动主要支持语句类型重写方式版本要求INSERT多值语法所有版本REPLACE多值语法5.1.37INSERT ON DUPLICATE KEY多值语法5.1.37其他DML分号连接多语句所有版本特别注意使用Statement而非PreparedStatement时UPDATE和DELETE只能通过分号连接的方式优化效率会打折扣。这也是我强烈推荐使用PreparedStatement的原因之一。3. 实战中的性能调优3.1 配置的正确姿势要让rewriteBatchedStatements发挥最大效力需要完整的配置方案JDBC连接字符串jdbc:mysql://localhost:3306/db?rewriteBatchedStatementstruecachePrepStmtstrueuseServerPrepStmtsfalse这里有几个关键组合cachePrepStmts缓存预编译语句useServerPrepStmtsfalse禁用服务端预处理与批处理有冲突版本选择强烈建议使用5.1.37版本这个版本对REPLACE语句的支持有质的提升。我在生产环境就遇到过从5.1.20升级后批量替换操作速度提升8倍的案例。批处理大小根据实测建议将批处理大小控制在500-1000条/批。太小的批次无法体现优势太大则可能触发max_allowed_packet限制默认4MB。3.2 真实性能对比数据为了直观展示效果我用相同硬件环境做了组对照测试批量插入10万条用户记录测试场景耗时(ms)网络请求数CPU占用默认参数18,245100,00012%仅开启批处理15,793100,00015%开启rewriteBatchedStatements3,1021,00035%优化后合理批次大小1,85710045%可以看到正确的参数组合能让性能提升近10倍这主要得益于网络往返次数从10万次降到100次MySQL服务器端的解析开销大幅降低事务日志写入更高效4. 避坑指南与最佳实践4.1 常见问题排查在实际使用中我遇到过不少坑这里分享几个典型案例问题1批处理执行后获取不到自增ID原因重写后的多值INSERT只返回第一个ID解决方案换用useServerPrepStmtstrue但会失去批处理优势或改为单条插入问题2大数据量时出现PacketTooBigException原因合并后的SQL超过max_allowed_packet限制解决方案// 动态调整批次大小 int batchSize 1000; for (int i 0; i total; i) { // 添加批处理... if (i % batchSize 0) { pstmt.executeBatch(); } }问题3MyBatis批量插入不生效原因需要同时配置rewriteBatchedStatements和allowMultiQueries正确配置spring: datasource: url: jdbc:mysql://localhost:3306/db?rewriteBatchedStatementstrueallowMultiQueriestrue4.2 高级优化技巧对于追求极致性能的场景我还有几个私藏技巧批次大小动态调整根据数据行宽自动计算合适的批次大小// 估算每行数据占用的字节数 int rowSize estimateRowSize(); // 计算不超过1MB的批次大小 int dynamicBatchSize 1024*1024 / rowSize;混合事务策略每5000条提交一次事务避免大事务问题conn.setAutoCommit(false); try { for (int i 0; i total; i) { // 添加批处理... if (i % 5000 0) { conn.commit(); } } conn.commit(); } catch (SQLException e) { conn.rollback(); }监控重写效果通过JDBC拦截器验证SQL是否被正确重写// 使用P6Spy等工具监控实际执行的SQL // 预期看到类似: INSERT INTO t VALUES(...),(...)记得第一次在生产环境应用这些优化时我们成功将数据同步任务的耗时从2小时压缩到了15分钟。这种性能飞跃带来的成就感正是我们工程师追求的技术极致。

相关文章:

深入解析rewriteBatchedStatements:如何通过SQL重写提升MySQL批处理性能

1. 揭开rewriteBatchedStatements的神秘面纱 第一次听说rewriteBatchedStatements这个参数时,我正被一个批量导入数据的性能问题折磨得焦头烂额。当时我们的系统需要每小时处理数十万条用户行为数据,但MySQL的插入速度始终上不去。直到某天深夜调试时&am…...

用ESP32-S3和SenseVoice,手把手教你打造一个能听懂中文的离线语音助手(附完整代码)

基于ESP32-S3与SenseVoice的离线中文语音助手开发实战 在物联网和边缘计算快速发展的今天,嵌入式设备的智能化需求日益增长。传统云端语音助手虽然功能强大,但在隐私保护、网络依赖和实时性方面存在明显短板。本文将详细介绍如何利用ESP32-S3芯片的本地A…...

(十五)32天GPU测试从入门到精通-图像分类模型性能对比day13

目录 引言主流图像分类模型模型架构对比精度 - 速度权衡不同 GPU 型号性能对比选型建议实战:模型对比 Benchmark总结与建议 引言 在实际 AI 项目中,选择合适的模型往往比优化单个模型更重要。不同的图像分类模型在精度、速度、资源消耗上有显著差异。 …...

VMware虚拟机安装教程:Qwen3-TTS开发环境配置

VMware虚拟机安装教程:Qwen3-TTS开发环境配置 1. 环境准备与系统要求 在开始配置Qwen3-TTS开发环境之前,我们需要先确保硬件和软件环境满足基本要求。这个环节很重要,好的开始是成功的一半。 首先来看看硬件要求。建议使用至少8GB内存的电…...

3步掌握ModTheSpire:Slay the Spire模组加载终极指南

3步掌握ModTheSpire:Slay the Spire模组加载终极指南 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire是《Slay the Spire》最强大的外部模组加载器,…...

如何永久备份微信聊天记录?这个免费工具让你轻松掌握数字记忆的主动权

如何永久备份微信聊天记录?这个免费工具让你轻松掌握数字记忆的主动权 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tr…...

浏览器字体渲染终极指南:3步打造媲美macOS的清晰文字体验

浏览器字体渲染终极指南:3步打造媲美macOS的清晰文字体验 【免费下载链接】GreasyFork-Scripts The open source code of this project is used for userscripts (油猴脚本) for desktop browsers, including Font Rendering (Customized) (字体渲染(自用…...

刘伟、龙擎天、马楠 | 人机环智能边界下的超级智能

刘伟、龙擎天、马楠 | 人机环智能边界下的超级智能...

一、FunctionCalling——大模型的外部能力接口,实现工具调用与任务执行

Function Calling(函数调用)是LLM 工程化、AI 智能体的核心基石。 如果大模型是大脑,那 Function Calling 就是让大脑「指挥手脚干活」的标准协议——它规定了大模型如何描述工具、如何输出调用指令、程序如何执行、如何回传结果。一、Functi…...

离散数学|代数系统核心概念与应用场景全解析

1. 代数运算:从买菜到编程的通用语言 第一次接触代数系统时,我盯着那些奇怪的符号发呆了半小时。直到有天在菜市场,看到大妈用计算器按"3515",突然意识到:这不就是二元运算吗?代数运算本质上就是…...

西门子S7-1500PLC大型程序实战:FB块PTO控制多轴运动,S7-1200PLC智能IO...

西门子S7-1500PLC大型程序,各种FB块PTO控制20多个轴,5台S7-1200PLC智能IO通讯,ModbusRTU通讯轮询,完整威纶通触摸屏程序,是学习西门子PLC通信、伺服好帮手 程序结构分明,注释详细,有机械结构图&…...

Windows 11终极清理指南:Win11Debloat一键优化你的系统体验

Windows 11终极清理指南:Win11Debloat一键优化你的系统体验 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter a…...

SHT30温湿度传感器项目避坑指南:从IIC地址冲突到数据校验的5个常见问题

SHT30温湿度传感器实战避坑手册:5个高频问题深度解析 第一次拿到SHT30传感器时,我以为按照手册接上线就能轻松读取数据。结果连续三天卡在各种奇怪的问题上——从设备无应答到数据校验失败,甚至出现温度值跳变到300℃的离谱情况。这篇文章不…...

Midscene Chrome扩展:如何用AI快速实现零代码浏览器自动化?

Midscene Chrome扩展:如何用AI快速实现零代码浏览器自动化? 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 还在为重复的浏览器操作而烦恼…...

LFM2.5-1.2B-Thinking-GGUF开发工具链整合:在IDEA中配置模型调试环境

LFM2.5-1.2B-Thinking-GGUF开发工具链整合:在IDEA中配置模型调试环境 1. 为什么要在IDEA中配置模型调试环境 对于Java开发者来说,IntelliJ IDEA是最常用的集成开发环境。将LFM2.5-1.2B-Thinking-GGUF模型的调试环境直接集成到IDEA中,可以显…...

Steam版《极限竞速:地平线5》总闪退?试试关闭这个容易被忽略的控制器设置

Steam版《极限竞速:地平线5》频繁闪退?可能是控制器设置惹的祸 最近在Steam社区和各大游戏论坛上,不少玩家反映《极限竞速:地平线5》在启动时频繁闪退,尤其是在使用外设控制器的情况下。这个问题困扰了许多热爱赛车游戏…...

51单片机 proteus仿真 直流电机

电路仿真代码#include <reg51.h>#define uchar unsigned char #define uint unsigned int #define LCD_Data P0 sbit IN1 P3^0; sbit IN2 P3^1; sbit ENA P3^2;sbit back P2^0; sbit forword P2^1; sbit up P2^2; sbit down P2^3; sbit stop P2^4; sbit LCD_RS…...

Cadence Allegro 17.4进阶指南:PCB Editor高效布线技巧与实战解析

1. Cadence Allegro 17.4 PCB Editor布线核心技巧 作为PCB设计领域的工业标准工具&#xff0c;Cadence Allegro 17.4的PCB Editor提供了强大的布线功能。在实际项目中&#xff0c;掌握这些技巧可以显著提升设计效率。我经手过多个高速PCB设计项目&#xff0c;深刻体会到合理使用…...

cve_2018_16509(ghostscript)漏洞复现报告

名称: vulfocus/ghostscript-cve_2018_16509:latest​描述: ​GhostScript 被许多图片处理库所使用&#xff0c;如 ImageMagick、Python PIL 等&#xff0c;默认情况下这些库会根据图片的内容将其分发给不同的处理方法&#xff0c;其中就包括 GhostScript。​在 9.24 之前的 Ar…...

Windows内核驱动手动映射终极指南:KDMapper完全攻略

Windows内核驱动手动映射终极指南&#xff1a;KDMapper完全攻略 【免费下载链接】kdmapper KDMapper is a simple tool that exploits iqvw64e.sys Intel driver to manually map non-signed drivers in memory 项目地址: https://gitcode.com/gh_mirrors/kd/kdmapper 还…...

CSL编辑器:重新定义学术文献样式编辑的智能方案

CSL编辑器&#xff1a;重新定义学术文献样式编辑的智能方案 【免费下载链接】csl-editor cslEditorLib - A HTML 5 library for searching and editing CSL styles 项目地址: https://gitcode.com/gh_mirrors/csl/csl-editor 你是否曾为学术论文的引用格式而烦恼&#x…...

傲梅分区助手 使用教程:免安装硬盘分区管理工具

一、工具简介 傲梅分区助手是一款功能强大的硬盘分区管理工具&#xff0c;支持无损数据调整分区大小、合并/拆分分区、迁移系统到 SSD 等操作。 安装包下载&#xff1a;https://pan.xunlei.com/s/VOpm6nKehfUHH-MDyIbMIhGkA1?pwdpm5g# 二、使用步骤 1. 解压工具包​ 右键点…...

LangChain揭秘:AI“大脑”+“手脚”+“记忆”,OpenClaw如何轻松打造智能助手?

LangChain是一个Python开发框架&#xff0c;用于定义AI流程、集成RAG&#xff08;知识库&#xff09;和Skills&#xff08;工具箱&#xff09;&#xff0c;控制逻辑。RAG提供信息&#xff0c;Skills执行任务。OpenClaw是集成RAG和Skills的完整AI助手框架&#xff0c;具备记忆和…...

保姆级教程:用两张RTX 4090本地搭建企业级TranslateGemma翻译引擎

保姆级教程&#xff1a;用两张RTX 4090本地搭建企业级TranslateGemma翻译引擎 1. 为什么选择本地化翻译系统&#xff1f; 在当今全球化的工作环境中&#xff0c;高效准确的翻译工具已成为刚需。但常见的在线翻译服务存在几个痛点&#xff1a; 数据隐私风险&#xff1a;敏感技…...

为什么要做 GeoPipeAgent那

指令替换 项目需求&#xff1a;将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一&#xff0c;测试代码示例 test.c // test.c #includ…...

Spring Cloud进阶--分布式权限校验OAuth控

一、核心问题及解决方案&#xff08;按踩坑频率排序&#xff09; 问题 1&#xff1a;误删他人持有锁——最基础也最易犯的漏洞 成因&#xff1a;释放锁时未做身份校验&#xff0c;直接执行 DEL 命令删除键。典型场景&#xff1a;服务 A 持有锁后&#xff0c;业务逻辑耗时超过锁…...

RAG 还是 Lucene:私有化部署客服系统的 AI 知识库架构选型窗

在之前的文章中&#xff0c;我们花了大量的篇幅&#xff0c;从记录后端pod真实ip开始说起&#xff0c;然后引入envoy&#xff0c;再解决了各种各样的需求&#xff1a;配置自动重载、流量劫持、sidecar自动注入&#xff0c;到envoy的各种能力&#xff1a;熔断、流控、分流、透明…...

IINA:macOS原生级视频播放体验的现代化解决方案

IINA&#xff1a;macOS原生级视频播放体验的现代化解决方案 【免费下载链接】iina The modern video player for macOS. 项目地址: https://gitcode.com/gh_mirrors/iin/iina 在macOS平台上寻找一款既能提供专业级播放功能&#xff0c;又保持系统原生体验的视频播放器&a…...

如何永久保存你的数字记忆:WeChatMsg聊天记录导出与年度报告生成终极指南

如何永久保存你的数字记忆&#xff1a;WeChatMsg聊天记录导出与年度报告生成终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub…...

被忽视的Windows网络加速技巧:禁用QoS保留带宽到底有没有用?(附gpedit.msc完整配置)

被忽视的Windows网络加速技巧&#xff1a;禁用QoS保留带宽到底有没有用&#xff1f; 在Windows系统优化的江湖传说中&#xff0c;"禁用QoS保留带宽提升网速"这个技巧已经流传了十几年。从Windows XP时代开始&#xff0c;各种技术论坛和优化指南都会提到这个"秘技…...