插入大量数据速度慢的解决方法:批量插入

场景:

项目需要导入案件2200条。其中导入的excel每个行案件的信息上包含大约15个联系方式。那么总的联系方式一共用30000条左右

这里优化之前的速度是16-20分钟之间。太慢了。找了好久优化的方法。最后确定了使用mysql批量插入的方法去进行插入操作


慢的原因及解决思路:

这里慢的原因是针对本项目:

插入方式为程序遍历循环逐条插入。在mysql上检测插入一条的速度在0.02s到0.04s之间。

所以逐条插入的速度是0.03*30000条的速度是15分钟左右。

所以逐条插入是没法优化的。然后去查询优化方式。发现用批量插入的方法可以提高很大速度。

将30000条数据的插入速度提升到1-2分钟左右


这里放一个测试demo例子:

用junit测试循环插入1000条数据的时间与用批量插入插入10000条使用的时间
1普通循环插入1000条数据的时间测试

	@Test
	public void insertCuiji() {
		 
		     List<Cuiji> list= new ArrayList<Cuiji>();
		     
		     Cuiji cuiji = new Cuiji();
		     cuiji.setBankcode("jylh");
		     cuiji.setCompanycode("qixin");
		     
		     for (int i = 0; i < 1000; i++) {
		    	  
		    	 cuijiMapper.insertSelectiveO(cuiji, "jylh");
			}
		     
		     
			
			
	}




执行速度是38s也就是0.038*1000的速度。比较慢了


2用批量插入插入10000条使用的时间

	@Test
	public void insertCuiji() {
		 
		     List<Cuiji> list= new ArrayList<Cuiji>();
		     for (int i = 0; i < 1000; i++) {
		    	 Cuiji cuiji = new Cuiji();
			     cuiji.setBankcode("jylh");
			     cuiji.setCompanycode("qixin");
			     list.add(cuiji);
		    	 
			}
		    cuijiMapper.insertListCuiji(list);
	}



批量插入使用了0.0356s 这相当于插入一条数据的速度,所以用批量插入会大大提升数据插入速度,当有较大数据插入操作是用批量插入优化


批量插入的写法:

dao定义层方法

Integer insertListCuiji(List<Cuiji> cuiji);

mybatis 的sql写法

<insert id="insertListCuiji" parameterType="java.util.List">
 	 INSERT INTO `case`.`t_cuiji`
			( `doccode`,
			  `companycode`,
			  `bankcode`,
			  `notes`,
			  `type`) 
		 values
		<foreach collection="list" item="item" separator="," index="index">
			(#{item.doccode},
			#{item.companycode},
			#{item.bankcode},
			#{item.notes},
			#{item.type})
		</foreach>

	</insert>

这样就能进行批量插入操作:

注:当批量操作数据量大的时候。例如我插入3w条数据要操作的数据包超过了1M会报 Mysql You can change this value on the server by setting the max_allowed_packet' variable. 异常 此时修改mysql的max_allowed_packet大小即可,详细解决方法请看:

http://blog.csdn.net/alice_qixin/article/details/78522600

或者将list分成几份去插入。


谢谢观看!

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值