大批量插入速度


10

在我的应用程序中,我的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

以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');

方法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');

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

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);

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

INSERT INTO bill (amount, bill_date) VALUES (?, ?);

任何其他方法都欢迎。

我的问题是

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

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

我的情况 -

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

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

我目前正在遵循方法3,将20,000次插入到一个空表大约需要10秒,这还不包括构造查询所花费的时间。

为了保持洞察力,从表中获取数据需要100-200毫秒。

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


Answers:


3

考虑分批提交。批大小为1024是一个很好的起始大小。更改批次大小,直到达到最佳吞吐量。


1

您是否测试过,或者是否有可能在要插入的目标数据库表上删除索引,将它们插入较小的批处理块中(如上所述,最佳),然后在目标表上重建索引一旦所有插入完成?可能很容易测试以确认。


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

希望对您有所帮助!


2
如果非常关闭约束检查(唯一,外键等),请确保从那时起您的数据不会破坏它们,或者数据库处于不一致状态。
David Spillett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.