大批量插入速度

Adi*_*tya 11 mysql innodb insert jdbc java

在我的应用程序中,我的 INSERT 似乎占用了大部分时间。我在内存中有大量对象(~40-50,000),我想将它们插入到表中。

让我们拿一个样本表

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

以 3 行作为我的批量大小,以下是我能想到的插入方法

方法 1 - 构建并触发 3 个原始插入

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');
Run Code Online (Sandbox Code Playgroud)

方法 2 - 将值合并到 1 个查询中

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');
Run Code Online (Sandbox Code Playgroud)

方法 3 - 触发此查询 1 次,传递 6 个参数

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);
Run Code Online (Sandbox Code Playgroud)

方法 4 - 触发这个准备好的查询 3 次,每次更改 2 个参数

INSERT INTO bill (amount, bill_date) VALUES (?, ?);
Run Code Online (Sandbox Code Playgroud)

欢迎任何其他方法。

我的问题是

在表中进行多个插入的最快方法是什么?

我已经阅读了有关 mysql 插入速度的链接JDBC 编程指南,但我无法得出结论。

我的情况 -

目前我的表有 ~ 20 列,其中大部分是数字,有几个 varchar(60) 和 1 个文本列。Mysql 5.5 版。在 INNODB 上运行并在 Integer 主键上有 1 个索引。所有查询都在事务中运行。

我从 Java 构建查询并使用 Spring JDBC 运行查询。

我目前正在遵循方法 3,向空表插入 20,000 次大约需要 10 秒,不包括构建查询所需的时间。

为了保持正确的观点,从表中获取数据需要 100-200 毫秒。

有什么我想念的吗?我如何使插入更快?

Luk*_*yen 0

mysql 文档中的一些批量数据加载技巧可能很有用。 https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html

您可以通过某些方式提高插入速度:

- turn off autocommit
- turn off unique check
- turn off foreign check
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!

  • 如果关闭约束检查(唯一、外键等),请非常确定您的数据不会破坏它们,或者从那时起您的数据库处于不一致的状态。 (3认同)