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 毫秒。
有什么我想念的吗?我如何使插入更快?
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)
希望这有帮助!
| 归档时间: |
|
| 查看次数: |
12067 次 |
| 最近记录: |