转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();

转自:http://hidba.org/?p=369

时间: 2024-10-12 20:55:43

转MySQL 批量提交优化的相关文章

Phoenix批量提交优化,官网的demo

1 Phoenix的批量insert官网代码,最佳实践 try (Connection conn = DriverManager.getConnection(url)) { conn.setAutoCommit(false); int batchSize = 0; int commitSize = 1000; // number of rows you want to commit per batch. try (Statement stmt = conn.prepareStatement(up

mysql的配置优化

需求:mysql的参数优化对于不同的网站,极其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次万次,需要在工作当中不断的监控观察和调试,才能得到最佳的效果.性能优化影响最大的变量分为连接请求变量和缓冲区变量. 理论总结: 修改vim/my.cnf max_connections = 1024    设置最大连接数为1024 back_log = 100      暂存的连接数量 wait_timeout = 100 interactive_timeout = 100

MySQL缓存参数优化(转)

MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO.本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化. query_cache_size/query_cache_type (global) Qu

MYSQL之性能优化 ----MySQL性能优化必备25条

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被

架构设计:系统存储(5)——MySQL数据库性能优化(1)

接上文:<架构设计:系统存储(4)--块存储方案(4)> 1.MySQL概述 从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案.关系型数据库的选型将以创业公司.互联网行业使用最广泛的MySQL数据为目标,但是MySQL的安装过程和基本使用方法等知识并不在我们讨论的范围内.后续几篇文章我们首先讨论影响单个MySQL节点性能的主要因素,然后介绍MySQL读写分离.数据表横纵拆分的原理和技术方案. MySQL数据库目前已被Oracle收购,并发展处多个版本.目前使用最广

mysql数据库性能优化(包括SQL,表结构,索引,缓存)

优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.降低 CPU 计算除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了.order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算).当我们的 IO 优化做到一定阶段之后

(转)MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

标签:服务器 数据库 老男孩 高薪技能 一线城市 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师-老男孩专家拥有16年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的真传,所以只有6年,嘿,废话不多说,下面开启MySQL优化之旅! 我们究竟应该如何对MySQL数据库进行优化?下面我就从MySQL对硬件

针对MySQL大表优化方案

详解MySQL大表优化方案 (1).字段 (2).索引 (3).规范查询SQL (4).存储引擎 (5).mysql配置参数优化 (6).mysql读写分离 (7).分区和分表 单表优化: 当单表的数据不是一直在暴增,不建议使用拆分,拆分会带来逻辑,部署,运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量 (1).字段 l 尽量使用TINYINT.SMALLINT

Mysql监控及优化

一.Mysql连接数 1.配置Mysql连接数: vim /etc/my.cnf [mysqld]下面修改 max_connections=1000 不写默认为100. wait_timeout=60 设置超时时间 2.查看当前连接数: show status like '%Threads_connected%'; show processlist;  二.Mysql缓存 1.开启缓存: vim /etc/my.cnf mysqld下面添加或修改 query_cache_type=on #开启缓