实体表
刚开始在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执行。这样就只有一次连接。