返回
为何说数据库批量插入更省时?某某小哥的实验结果了解一下!
后端
2024-02-16 17:04:32
随着项目的复杂度日渐增加,面对海量数据的导入成为了企业和开发者们亟需解决的问题,而批量插入就是解决这一问题的有利方式。近日,就这一问题,某某小哥在 SpringBoot 2.5 Mysql 8 JD 的环境下,进行了详细的实验,来看看他的发现吧!
一、初始化环境
环境的配置有几大关键:
- 测试平台:采用了 Windows 10操作系统,Intel Core i7-8700K 处理器,32 GB 内存,以及 512 GB 固态硬盘。
- 数据库:使用的是 Mysql 8.0.23 版本。
- Java 开发环境:采用了 SpringBoot 2.5.6 版本。
- 工具:使用 IntelliJ IDEA 2021.2.2 版本作为开发工具。
二、创建测试表
为了进行实验,我们需要创建一个测试表。下面是创建表的 SQL 语句:
CREATE TABLE `test_data` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
`address` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
三、批量插入和循环插入对比
实验分为两部分:
1. 批量插入
List<TestData> dataList = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
TestData data = new TestData();
data.setName("test" + i);
data.setAge(i);
data.setAddress("address" + i);
dataList.add(data);
}
long start = System.currentTimeMillis();
testDataRepository.saveAll(dataList);
long end = System.currentTimeMillis();
System.out.println("批量插入耗时:" + (end - start) + "毫秒");
2. 循环插入
for (int i = 0; i < 100000; i++) {
TestData data = new TestData();
data.setName("test" + i);
data.setAge(i);
data.setAddress("address" + i);
long start = System.currentTimeMillis();
testDataRepository.save(data);
long end = System.currentTimeMillis();
System.out.println("循环插入第" + i + "条数据耗时:" + (end - start) + "毫秒");
}
四、结果对比
通过实验,我们获得了以下结果:
操作类型 | 耗时(毫秒) |
---|---|
批量插入 | 1001 |
循环插入 | 10320 |
五、结论
实验结果表明,批量插入比循环插入的效率高出许多。在我们的测试中,批量插入 100000 条数据仅耗时 1001 毫秒,而循环插入 100000 条数据却耗时 10320 毫秒。
六、思考
-
为何批量插入比循环插入更高效?
- JDBC 是以数组的形式发送数据到数据库服务器,而不是一条一条地发送。
- 数据库服务器一次性处理所有数据,而不需要反复建立和断开连接。
-
何时应该使用批量插入?
- 当你需要插入大量数据时。
- 当你需要提高插入数据的速度时。
-
如何优化批量插入的性能?
- 使用合适的批量大小。
- 使用预编译语句。
- 使用事务。