Mysql

大批量的插入速度

  • August 26, 2017

在我的應用程序中,我的 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 - 通過 6 個參數觸發此查詢 1 次

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 毫秒。

有什麼我想念的嗎?如何使插入更快?

考慮批量送出。批量大小為 1024 是一個很好的起始大小。更改批次大小,直到達到最佳吞吐量。

您是否測試過或者是否可以在您要插入的目標數據庫表上刪除索引,將它們插入到較小的批處理塊中(如上所述是最佳的),然後在目標表上重建索引一旦所有插入完成?可能很容易測試以確認。

引用自:https://dba.stackexchange.com/questions/46886