Mysql 批量insert 性能测试

批量执行insert时,有多种执行方式:

  1、循环单条执行,类似:


for(){

insert(sql);

}

  2、合并为一个事务执行(注:Mysql默认事务是自动提交的,需关闭事务自动提交),类似:

  事务begin


for()

{

insert(sql);

}

  事务commit

  3、采用insert...values value1,value2批量执行,类似:

  insert into table_name values (value1),(value2)...(valueN);

  下表是在单机情况下,通过java api调用mysql接口方式执行10,100,500,1000条记录insert时的性能表格

  备注:

  1 数据表大小未超过innodb_buffer_pool_size。

  2 单条记录为308个字节,max_allow_packet设置为16M。

  3 innodb_flush_log_at_trx_commit=1,单机无binlog。

  4 测试中的执行时间只是一个相对值,不同机器表现肯定不一样。

  结论:

  1、从实测情况可以知道,在3 的情况下,批量insert性能最高。

  2、java api里面的addBatch是1的情形。

  造成性能差距的可能原因:

  1和2,(1) 1在执行每一条insert时,mysql都会启动一个事务来跟踪;而2减少了mysql的事务数。

  (2) 减少了事务日志的同步次数。

  1和3,(1) 压缩了网络通信次数,(2) 减少了sql解析次数,(3) 减少了事务数和日志同步次数。

  2和3,减少了sql解析次数。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-07-28 16:57:53

Mysql 批量insert 性能测试的相关文章

mysql 批量修复_Mysql

#!/bin/bash host_name=127.0.0.1 user_name= user_pwd= database= need_optmize_table=false tables=$(/usr/local/webserver/mysql/bin/mysql -h$host_name -u$user_name -p$user_pwd $database -A -Bse "show tables") for table_name in $tables do check_resul

MySQL批量插入数据脚本_Mysql

MySQL批量插入数据脚本 #!/bin/bash i=1; MAX_INSERT_ROW_COUNT=$1; while [ $i -le $MAX_INSERT_ROW_COUNT ] do mysql -uroot -proot dbname -e "insert into tablename (name,age,createTime) values ('HELLO$i',$i % 99,NOW());" d=$(date +%M-%d\ %H\:%m\:%S) echo &qu

mysql 批量更新与批量更新多条记录的不同值实现方法_Mysql

批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 复制代码 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 复制代码 代码如下:  UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');  这里注意

mysql 批量更新与批量更新多条记录的不同值

批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写:  代码如下 复制代码 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可:  代码如下 复制代码  UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 '

并发-请教一个mysql批量更新时的deadlock问题?

问题描述 请教一个mysql批量更新时的deadlock问题? 数据是mysql 5.6 表引擎是innoDB,DAO是mybatis3 有个表,比如是订单-物品表,里面保存每个订单的所有物品清单 字段有:record_id(记录id,自增长),order_id(订单id),good_id(物品id)等其他字段.. 有个数据同步的业务场景 需要在一个事务里 先根据order_id做删除操作,delete from xxx where order_id=xx 然后再批量增加订单-物品清单inser

【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合

需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异参考文章] 问题二:批量入库就需要有高并发的消息队列,决定

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

mysql批量更新多条记录的同一个字段为不同值的方法_Mysql

首先mysql更新数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 也可以这样用in指定要更新的记录: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 'other_values' 是一个逗号(,)分隔的字符串,如:1,2,3 如果更新多条数据而且每条记录要更新

高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis list 仿真实现,而且方便回滚. 问题三:日志量毕竟大,保存最近30条足矣,决定用php写个离线统计和清理脚本. 一.设计数据库表和存储 考虑到log系统对数据库的性能更多一些,稳定性和安全性没有那么高,存储引