夜间模式
批量新增
我们知道新增加数据时使用insert ... values....(),()...()
会大大节约时间
但是在实际开发过程中,我们需要把数据先创建一个实体类再根据实体类进行添加数据。
如果有一百万、一个亿的数据的时候,我们可以使用List存储数据并进行批量插入,但是一亿个List有点大
这就需要分批次进行添加
java
for(int i = 10; i < 1000010; i++){
var user = User.builder()
.username("user+"+i)
.balance(2000)
.phone("12345648910")
.password("123456")
.info("{\"name\":\"John\", \"age\":30}")
.status(1)
.build();
userService.save(user);
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
java
List<User> list = new ArrayList<>();
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 1000; j++) {
var user = User.builder()
.username("user+" + i*100+j)
.balance(2000)
.phone("12345648910")
.password("123456")
.info("{\"name\":\"John\", \"age\":30}")
.status(1)
.build();
list.add(user);
}
userService.saveBatch(list);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
一百万条的数据,前者我进行测试添加,发现耗时1小时30分钟
后者批量添加着一百条数据仅需2分39秒
但是速度依旧不是很快
我需要让这么多条语句在mysql上变成一句insert ... values....(),()...()
这种格式
该怎么办呢
我们在配置mysql驱动时加上这样一句rewriteBatchedStatements=true
即可
yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 201819
1
2
3
4
5
6
2
3
4
5
6
此时mysql驱动会帮我们做一个处理
现在运行后者只需要47秒就可以完成任务了。