用mysql批量插入百万数据

实体表
在这里插入图片描述

刚开始在Java代码层面批量插入

for (int i = 1; i <1000000 ; i++) {
            Orders orders=new Orders();
            orders.setAmount(i);
            orders.setPid(i);
            orders.setSno(i);
          ordersService.save(orders);
        }

结果插入特别的慢,可惜没统计时间,大概几分钟了还在5万条左右。
我估计是我这么操作,每次都要创建连接,连接关闭,交给mysql一条条执行导致大量的数据库连接以及IO操作,太慢了。

然后我想着把它放到一个集合里面,调用批处理。

List<Orders> list=new ArrayList<>(1000000);
        for (int i = 1; i <1000000 ; i++) {
            Orders orders=new Orders();
            orders.setAmount(i);
            orders.setPid(i);
            orders.setSno(i);
            list.add(orders);
        }
        ordersService.saveBatch(list);

结果感觉比之前快了几倍,但还是慢。
改进用存储过程

drop PROCEDURE if exists test_insert;
delimiter //
CREATE PROCEDURE test_insert(n int)  
    begin  
        declare v int default 1;
        SET AUTOCOMMIT=0;       
        while v < n 
        do  
            insert into orders  
            values (v,v,v,v);  
            set v = v + 1;  
        end while;
        SET AUTOCOMMIT=1;       
    end //

调用
在这里插入图片描述

30秒左右百万数据就插入了
在这里插入图片描述

还有一个想法就是直接循环拼接到一条sql里面,然后insert执行。这样就只有一次连接。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值