mysql 批量执行update语句最佳方案思考

最近运维问了我一个问题,mysql批量执行一万多条update,如何做才能把风险和损失做到最低?

这个问题,我没有直接回答,因为我也没有类似的经历。于是搜集资料得出结论如下。


mysql 默认是autocommit=on也就是默认开启自动提交事务。这种情况下,一条sql就会开启一个事务,这时候同时执行一万条update,就会导致实际开启一万个事务,然后挨个执行,挨个开启,挨个提交。

缺点:同时锁住数据较少,但是数据库资源占用严重,对外提供操作性能急剧下降。


当autocommit=off时,同时执行一万条update,那么只会开启一个事务,等到所有都update后,一并commit。
缺点:同时锁住数据较多,外面的select进不来,大量连接等待获取行锁,同样影响数据库对外服务能力。


最终优化方案:建议,把autocommit设置off,然后执行update的时候,手动分批commit,分批条数限制100,或者200,比如一万条update,按照每100条 就commit一次,10000个update总共需要100个事务,每次锁住100条数据。性能将会得到很大提升。

当然,选择多少条手动commit,这个需要根据各自业务实际情况而定。

相关测试数据,正在验证ing!~~如有理解不当的地方,也欢迎各位给出宝贵建议和指点!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值