Mybatis批量插入实测

众所周知,在jdbc中的批量插入默认情况下仍是以单条数据循环操作数据库的,而非真正意义上的批量操作,只有在设置rewriteBatchedStatements=true的情况下才会进行真实的批量操作,那么问题就来了,mybatis是对jdbc的二次封装,那么它的批量插入又是怎么样的呢?
笔者对其进行了性能上的简单测试,大致进行四种情况的实验:
1.默认情况;
2.开启了rewriteBatchedStatements=true;
3.设置解析器为batch解析器;
4.既开启了rewriteBatchedStatements=true又设置解析器为batch解析器;

插入方式大致分为:
1.1次1条插1000次共1000条,即1000条独立的insert语句串行插入;
2.1次500条插100次共5w条,即使用foreach拼接500条数据,然后共100条insert语句串行插入;
3.1次1k条插50次共5w条,同上;
4.1次1w条插5次共5w条,同上;
5.1次5w条插1次共5w条,同上;
题外话:这里曾批量一次插入10w条,但由于mysql的max_packet_size限制导致语句被拒绝。

大致结果如下:

默认配置下:
1次1条插1000次共1000条 5415ms
1次5w条插1次共5w条 5159ms
1次1w条插5次共5w条 3730ms
1次1k条插50次共5w条 3030ms
1次100条插500次共5w条 5960ms
1次500条插100次共5w条 3718ms

开启rewriteBatchedStatements=true之后:
1次1k条插50次共5w条 3139ms
1次1w条插5次共5w条 3582ms
1次500条插100次共5w条 4029ms
1次1条插1000次共1000条 5032ms
1次1条插5000次共5000条 19770ms

关闭rewriteBatchedStatements并设置执行器为batch:
1次5w条插1次共5w条 5717ms
1次1k条插50次共5w条 3071ms
1次1w条插5次共5w条 3389ms
1次500条插100次共5w条 4112ms
1次1条插1000次共1000条 4744ms

开启rewriteBatchedStatements=true并设置执行器为batch:
1次5w条插1次共5w条 5548ms
1次1k条插50次共5w条 3213ms
1次1w条插5次共5w条 3212ms
1次500条插100次共5w条 3560ms
1次1条插1000次共1000条 5869ms

这里偷个懒,没有整理成表格,主要是因为没有使用真正的benchmark测试,而是通过代码获取当前时间差值的结果,这个结果在宏观上是可信的,在细节上由于CPU、热编译等情况数据其实并不可信。

最后放结论:mybatis默认情况下通过foreach拼接sql最后执行时即是真实的批量执行,而rewriteBatchedStatements=true和设置解析器为batch模式也并无对性能的可见影响(应该还是有影响的)。相比一条一条的insert语句,批量插入的性能要高出几个数量级,但值得注意的是批量处理中并非单次数量越多越好,根据mysql官方的说法,单次insert在100~1000应该是最佳,但该值与机器性能、表数据量、单条记录的大小以及rewriteBatchedStatements配置和batch模式是否开启等等皆有关。此外,单条sql中含有过多记录会使这些记录进行强绑定,即一条错误一批都会插入失败,所以批量插入时需要结合业务程序、表结构、数据量等诸多因素进行细致考虑。


标题:Mybatis批量插入实测
作者:Aresxue
地址:http://52.81.103.103:8080/articles/2019/08/30/1567152729641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值