一、rewriteBatchedStatements参数
1、MySQL JDBC驱动在默认情况下会无视executeBatch()【也就是说JDBC默认情况下,会将你的语句分拆成单个,一条一条发给数据库执行,数据量小时感知不大,1w或10w以上差距越来越大】
2、MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。【只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL,另外这个选项对INSERT/UPDATE/DELETE都有效】
添加rewriteBatchedStatements=true这个参数后的执行速度比较:
二、批量插入信息
2.1普通saveBatch批量插入
我们循环1万次,把每个对象装到员工集合(List)中,然后调用Mybatis-Plus的saveBatch方法,传入List集合,实现批量插入,然后我们在方法开始结束的地方,计算当前函数执行时长。
@PostMapping("/addBath")
@ResponseBody
public CommonResult<Employee> addBath(){
long startTime = System.currentTimeMillis();
List<Employee> list = new ArrayList<>();
// 循环批量添加1万条数据
for (int i = 0; i < 10000; i++) {
Employee employee = new Employee();
employee.setName("测试"+i);
employee.setAge(20);
employee.setSalary(9000D);
employee.setDepartmentId(i);
list.add(employee);
}
boolean batch = employeeService.saveBatch(list);
if(batch){
long endTime = System.currentTimeMillis();
System.out.println("函数执行时间:" + (endTime - startTime) + "ms");
return CommonResult.success();
}
return CommonResult.error();
}
批量添加1万条数据,测试结果如下:
第一次:(2秒多)
第二次:(接近2秒)
第三次:(接近2秒)
差不多添加1万条数据在2秒左右,这个时候我们加大量10万条,再测试:
批量添加10万条员工数据,测试结果如下:
第一次:(19.341 秒)
第二次:(18.298 秒)
以上为摘录出品,不过结果却是真实的,确实是这样。不过我在循环插入6w多条数据时基本都会在执行executeBatch时卡住,程序也不报错就是没反应,基本第一次遇到这种情况的会懵掉,常识来说很难排查,因为没有报错日志...
2.2设置rewriteBatchedStatements=true批量插入后
190W条数据导入,执行时间206秒还可以接受了。