返回

为何说数据库批量插入更省时?某某小哥的实验结果了解一下!

后端

随着项目的复杂度日渐增加,面对海量数据的导入成为了企业和开发者们亟需解决的问题,而批量插入就是解决这一问题的有利方式。近日,就这一问题,某某小哥在 SpringBoot 2.5 Mysql 8 JD 的环境下,进行了详细的实验,来看看他的发现吧!

一、初始化环境

环境的配置有几大关键:

  1. 测试平台:采用了 Windows 10操作系统,Intel Core i7-8700K 处理器,32 GB 内存,以及 512 GB 固态硬盘。
  2. 数据库:使用的是 Mysql 8.0.23 版本。
  3. Java 开发环境:采用了 SpringBoot 2.5.6 版本。
  4. 工具:使用 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 毫秒。

六、思考

  1. 为何批量插入比循环插入更高效?

    • JDBC 是以数组的形式发送数据到数据库服务器,而不是一条一条地发送。
    • 数据库服务器一次性处理所有数据,而不需要反复建立和断开连接。
  2. 何时应该使用批量插入?

    • 当你需要插入大量数据时。
    • 当你需要提高插入数据的速度时。
  3. 如何优化批量插入的性能?

    • 使用合适的批量大小。
    • 使用预编译语句。
    • 使用事务。