背景

用户修改布局时,需要批量更新mysql的xxxx_layout_xxxx表。批量操作的数据量是2-30条/次。批量操作是这次项目在技术上比 较关键的一个点,之前批量操作做过性能上的测试,mysql端问题不大,7000+tps,Java端的效率有些差,有优化空间。

对批量的性能进行了测试,优化。过程如下

经测试,批量更新30条记录的时间是35ms。由于数据在mysql服务端中会有内存缓存,批量更新30条的时间用了35ms,感觉有些长,试图找出原因。

使用截包工具(这里用的ethereal),抓取mysql的数据包,下面是一次批量更新的数据包:

可以看出,批量更新时,每条update语句都去mysql请求了一次。并没有打包发给mysql。这种批量的效率肯定不会高。同样方法试了下oracle数据库,oracle驱动做的就很好,一次批量是打包在同一个请求中,是真正的批量提交,效率自然比mysql高。

找了些资料,发现mysql默认情况确实是不支持batch。为了解决上面的问题,需要给JDBC连接加上参数rewriteBatchedStatements=true,并且jdbc driver需要升级到5.1.8以上才支持这个参数。

增加参数rewriteBatchedStatements=true,driver版本升到5.1.17后,再次测试,批量更新30条的时间从35ms降到了11ms。截包后,可以看出底层的机制,已经变成批量提交:

查看包的内容可以发现,这条请求里,封装了30条update语句

横坐标: 一次批量更新的条数。纵坐标:更新100次所用时间(ms)

可见,当批量条数增加时,rewriteBatchedStatements=true的性能有很大优势。即使数量少时,也还是有一定优势。

结论

使用rewriteBatchedStatements=true参数,对批量操作,性能有较大提高,从官方解释上看,对普通操作没有影响。 从网上资料和自己的测试上看,暂时没有发现rewriteBatchedStatements=true参数Driver版本5.1.17的问题。 因此,本项目中计划采取下面优化措施:

  • JDBC Driver版本从5.0.4升级到5.1.17。
  • 连接属性中加入rewriteBatchedStatements=true参数

附:

测试环境:

mysql JDBC 3.0.4/3.1.17。

客户端: 普通PC机。

连接池数: 1-10。

10线程并发,批量更新30条记录(索引有效),循环更新100次。

批量更新主要代码:

mmpSqlMapClient.startTransaction(); // 使用事务

mmpSqlMapClient.startBatch(); // 批量提交

for (ChannelLayoutDO channelLayout: userChannelLayoutList) {              mmpSqlMapClient.update(“UserChannelLayoutDAO.updateSort”, channelLayout);

}

mmpSqlMapClient.executeBatch();

mmpSqlMapClient.commitTransaction();

mysql批量提交的优化相关推荐

  1. mysql数据没有真正提交,转MySQL 批量提交优化

    用户修改布局时,需要批量更新mysql的xxxx_layout_xxxx表.批量操作的数据量是2-30条/次.批量操作是这次项目在技术上比较关键的一个点,之前批量操作做过性能上的测试,mysql端问题 ...

  2. mysql批量插入性能优化:executeBatch如何通过rewriteBatchedStatements参数逆袭

    文章目录 前言 一.实战演示 1.单元测试 2.不添加rewriteBatchedStatements参数 3.添加rewriteBatchedStatements参数 4.采用InsertBatch ...

  3. c mysql批量插入优化_MySQL实现批量插入以优化性能的教程

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  4. mysql 优化配置 大批量数据插入_MYSQL开发性能研究——批量插入的优化措施

    一.我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句. INSERT INTO TBL_TEST (id) VALUES(1); 很显然,在MYSQL中,这样的方式也 ...

  5. mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  6. Mysql批量插入数据问题解决和优化

    Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...

  7. mysql+提升更新语句效率_MySQL加快批量更新 UPDATE优化

    如果是更新为同样的内容,没啥难度,直接在where里面下功夫就好了,大家都懂,我要说的是针对更新内容不一样的情况 首先,先看看网上转载的方法: mysql 批量更新如果一条条去更新效率是相当的慢, 循 ...

  8. Mysql批量插入更新性能优化

    Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...

  9. MYSQL批量插入数据库实现语句性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...

最新文章

  1. 原生JavaScript实战之搜索框筛选功能
  2. [BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)
  3. C++leetcode找出两个有序数组的中位数(2)
  4. java上传文件文件保存后损坏_Laravel存储文件在上传时会损坏
  5. 看动画学算法之:平衡二叉搜索树AVL Tree
  6. add.attribute向前端传_前端知识-概念篇
  7. 偷源代码!还和前东家一起投标……最终被判 3 年
  8. php excel 函数,php实现excel中rank函数功能的方法
  9. TypeError: Layout of the output array image is incompatible with cv::Mat
  10. Log42j 源代码分析:日志回滚
  11. 微信小程序项目源代码SSM校园生活小助手+后台
  12. 数据血缘关系图 工具_MCGS组态软件实现数据报表
  13. 黑马程序员 python 数据分析 代码_2020年最新版 5.0程序员 黑马python人工智能数据分析机器学习软件测试全栈开发...
  14. 程序员微信名昵称_微信名字大全
  15. Mac上使用docker环境进行C++开发的实践
  16. excel绘制气泡图步骤
  17. 从COVID-19大流行中汲取哪些教训?10种方法帮CIO预防下一次危机
  18. C# 怎么把集合转换成数据库添加语句,把类转换成sql语句
  19. 转载:持续集成之解决jenkins内存溢出问题
  20. PHP中的empty()函数

热门文章

  1. java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0
  2. Python爬虫基本库的使用
  3. 搭建MySQL+MHA服务易错位置
  4. python中元组可以比较大小吗_python元组比较
  5. 用java正则表达式验证字符串(邮箱与网址)
  6. 计算机控制的工频机是什么,UPS 如何分类,工频机和高频机区别是什么?
  7. python中如何打印两行代码间的空行_python 打印几行空行、 打印不换行
  8. led显示屏服务器怎么设置,led显示屏怎么改字幕 led显示屏改字幕方法
  9. python多态_多态是什么?为什么要使用多态?
  10. 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析