mysql批量提交的优化

.背景

用户修改布局时,需要批量更新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();

时间: 2024-10-31 00:20:07

mysql批量提交的优化的相关文章

批量处理-mysql 批量提交数据,在存储过程中,分别判断是更新,还是插入,怎么统计更新了多少条,插入了多少条

问题描述 mysql 批量提交数据,在存储过程中,分别判断是更新,还是插入,怎么统计更新了多少条,插入了多少条 存储过程中计数器初始设置为零,每成功一次加1, 问题是,批量处理后,计数器每次都被重置,没有实现累加 求解救 解决方案 计数写全局变量,不要用局部变量 解决方案二: 如果是用JDBC批量提交数据的话,会返回一个int值标识插入或者修改或者删除了多少条记录的. 解决方案三: 你是否定义为局部变量了,或者是你没有执行增加操作,一直是在赋值.

小议SQLServer批量更新的优化

听全老大的JDBC课的时候,听到一节是讲在利用JDBC中处理批量更新oracle数据时候的特性,让我很为JDBC的特性感的兴奋,利用这个特性可以在批量更新数据的时候不同往常一样每次都需要传送完成的SQL语句到数据库中.其中示范代码如下: 1 import java.sql.*;2 3 public class BatchUpdates4 {5   public static void main(String[] args)6   {7     Connection          conn =

MySQL实现批量插入以优化性能的教程_Mysql

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1. 一条SQL语句插入多条数据.常用的插入语句如:   INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VA

美图秀秀DBA谈MySQL运维及优化

随着MySQL应用的不断普及和自身发展,如何更好的优化MySQL和使用MySQL,依然是一个比较有挑战的问题,尤其是在业务快速增长的场景下.本次分享主要介绍一些通用的运维优化实践和问题,以及未来的一些方向.  目录 MySQL的优势和劣势 数据库规范化 Sharding拆分 数据库备份 性能优化 从每个月的db engines排名可以看到,关系数据库依然占主导地位,nosql的种类和可选择空间更大,总共283种数据库,里面大多数也是NoSQL. 如何选择数据库,从以下几个因素考虑: 应用场景:O

MySQL Group Commit的优化

最近花了一些时间在做MySQL Group Commit的优化,关于Group commit的原理,这里不再赘述,有兴趣的可以翻阅我之前的博客http://mysqllover.com/?p=581,这里简单描述下两点优化,主要基于MySQL5.6.16 1.优化binlog_order_commits=0并且sync_binlog>0时的性能  我们知道当binlog_order_commits关闭时,表示我们能接受binlog commit和innodb commit的顺序不同(这不会带来数

Mysql批量插入和更新的性能

问题描述 利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不固定),循环3000次.每次在循环到100次左右的时候,会出现"com.jolbox.bonecp.ConnectionPartition - BoneCP detected an unclosed connection and will now attempt to close it f

加速PHP动态网站 MySQL索引分析和优化

本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 假设我们创建了一个名为peo

加速动态网站 MySQL索引分析和优化

本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 假设我们创建了一个名为peo

Delphi FireDAC 下的 Sqlite(十一) 批量提交 SQL 命令的测试

可把下面代码直接贴在空白窗体上, 以快速完成窗体设计: object DBGrid1: TDBGrid Left = 0 Top = 0 Width = 265 Height = 338 Align = alLeft DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Nam