Mybatis-plus批量插入、批量修改数据saveBatch等速度缓慢

[转]Mybatis-plus批量插入、批量修改数据saveBatch等速度缓慢

Arebirth博客园: 原文链接

背景

使用mysqlPlus. 不管是updateBatch, 还是saveBatch, 800条左右的数据,
耗时都超过1s以上

尝试更改每次批量处理的数量, 比如:

super.updateBatchById(list,1000);

如果不传第二个参数, mysqlPlus默认是1000. 这个根据调整, 发现低于1000, 耗时增加,15002500ms左右, 因为sql分多次执行, 中间IO请求的耗时比较大.
设置为1000(因为总共测试数据都没有1000, 所以没有尝试更大的值), 为900ms到1200ms左右.

这时间太久了,在网上找办法.

处理

最后发现在sql链接后追加: rewriteBatchedStatements=true. 再次尝试, 已经缩减到100ms!

 url: jdbc:mysql://localhost:3306/zgd?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true

在这里插入图片描述


补充
在看源代码的时候, 发现mybatisPlus会预编译插入的sql, 如果一条记录A,B,C都有值, 则预编译为 values(?,?,?) ,且如果下一条又是三个字段都有值就直接合并一条sql.
但是如果遇到A,B有值,C没有值, 就会重现编译一条sql values(?,?)

所以如果我们查出来的数据,有些字段是null,且不怎么规则的时候,批量save会预编译出很多条sql
要解决这个问题, 一个是可以自己手动设置非null的初始值, 另一种方式是在可能为null的字段上加,insertStrategy = FieldStrategy.IGNORED,fill = FieldFill.DEFAULT, 它表示插入的时候不校验是否为null, 都给你编译一个?占位

在修改之前, 发现打印的日志有很多条编译的insert sql. 修改只有就只有一条 values(?,?,?)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值