在我的应用程序中,我的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毫秒。
我有什么想念的吗?我如何使插入物更快?
堆栈溢出的相关问题:rewriteBatchedStatements = true的MySQL和MySQL
—
Gord Thompson