MyBatis批量插入的3种方案对比,速度差10倍!

boyanx4周前技术教程9

你还在用for循环做MyBatis批量插入? 本文通过真实案例+代码实测,对比三种批量插入方案的速度差异与实现原理。文末附实测数据截图,看完立省80%数据库操作时间!


一、青铜方案:循环单条插入(性能灾难)

// 典型错误示例
for (User user : userList) {
    userMapper.insert(user);
}

特点

  • 每条insert语句单独执行
  • 每次请求都经历完整JDBC流程
  • 事务自动提交(除非手动控制)

实测结果(1万条数据):

  • 耗时:约30秒
  • 优点:代码简单
  • 缺点:产生1万次网络IO,99%的时间浪费在连接开销

二、白银方案:BatchExecutor批处理(性能提升10倍)

// 开启批处理模式
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

for (User user : userList) {
    mapper.insert(user);
    if(i % 1000 == 0){
        sqlSession.flushStatements(); // 分段提交
    }
}
sqlSession.commit();

核心原理

  • 通过ExecutorType.BATCH启用JDBC批处理
  • 将多个SQL语句打包发送
  • 事务统一提交

实测结果(1万条数据):

  • 耗时:约3秒
  • 优点:JDBC层优化,网络IO减少90%
  • 缺点:需要手动控制提交时机

三、王者方案:动态SQL拼接(极限性能)

<!-- XML动态SQL -->
<insert id="batchInsert">
    INSERT INTO user (name,age) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

执行特点

  • 生成单条INSERT INTO ... VALUES (...),(...)语句
  • 数据库单次解析执行
  • 利用数据库批量写入优化

实测结果(1万条数据):

  • 耗时:约1秒
  • 优点:理论最快执行方式
  • 致命缺陷:SQL长度限制(MySQL默认4MB)

全方位对比表

维度

循环单条插入

BatchExecutor

动态SQL拼接

执行方式

N条独立SQL

JDBC批处理

单条大SQL

网络IO次数

N次

1次

1次

事务控制

自动提交

手动提交

单事务

内存消耗

高(SQL缓存)

可读性

★★★★

★★★

★★

适用场景

<100条

1k-10w级

<5k条(防溢出)


实测数据验证(1万条记录)


避坑指南

  1. 动态SQL长度陷阱:MySQL的max_allowed_packet参数限制单条SQL大小
  2. 批处理内存溢出:每5千条左右建议执行flushStatements()
  3. 事务一致性:BatchExecutor必须显式commit才会生效
  4. 主键回写:动态SQL方案无法获取全部自增ID

选型建议

  • 小数据量(<500条):动态SQL方案最优
  • 常规批量(1k-5w条):BatchExecutor最稳妥
  • 超大数据量(>10w条):结合BatchExecutor+分段提交

终极技巧:生产环境推荐组合方案:BatchExecutor + 分批次提交 + 动态SQL长度控制,实测可提升百倍性能!


思考题:为什么动态SQL方案在Oracle数据库中反而可能变慢?欢迎评论区讨论!(提示:与SQL解析机制有关)

相关文章

揭秘:打造一套完整的勒索病毒自动化采集分析系统

引言:勒索病毒威胁持续升级2024年全球勒索病毒攻击事件呈现爆发式增长。根据国家计算机病毒应急处理中心发布的《网络空间安全态势分析报告(2024)》显示,2023年7月至2024年6月,全球共有26个...

让 Python 代码 “飞” 起来的实用技巧,你知道几个?

各位 Python 编程爱好者们!你们有没有过这样的经历,满心欢喜地写好代码,运行起来却发现速度慢得让人着急,心里别提多郁闷了。别担心,今天我就把珍藏已久的 9 个让 Python 代码效率飙升的技巧...

C语言 vs C++:谁才是编程界的“全能王者”?

C++和C语言作为两种广泛使用的编程语言,在设计理念、功能特性和适用场景上有显著差异。以下是它们的主要区别:1. 编程范式o C语言:过程式编程,强调函数和步骤化执行。o C++:多范式语言,支持过程...

python字符串拼接的方式和性能对比

在编程过程中,常会用到字符串拼接。python里字符串拼接主要有四种方式,分别是,使用加号,join方法,百分号或format字符串格式化,f-string。其中,加号运算符无疑是最常用和最简单的字符...

DeepSeek昨夜上新!新旧版V3对比实测,代码能力飙升,震惊海外用户

来源:智东西作者 | 陈骏达编辑 | 漠影智东西3月25日报道,昨日晚间,DeepSeek在开源平台悄然上线了升级后的DeepSeek-V3模型。新模型的版本号为DeepSeek-V3-0324,模型...

腾讯云国际站:腾讯云怎样检测隐藏的后门程序?

本文由【云老大】 TG@yunlaoda360 撰写文件完整性验证文件 hash 校验 :可使用 md5sum 命令对文件进行哈希值计算,并与原始代码的 hash 值进行对比,从而快速发现文件是否被篡...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。