Mysql
大批量的插入速度
在我的應用程序中,我的 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 是一個很好的起始大小。更改批次大小,直到達到最佳吞吐量。
您是否測試過或者是否可以在您要插入的目標數據庫表上刪除索引,將它們插入到較小的批處理塊中(如上所述是最佳的),然後在目標表上重建索引一旦所有插入完成?可能很容易測試以確認。