因此,爲了開發的目的,我需要一個大約有100萬到1億個值的表格,我目前的方法並不快。MySQL - 如何快速插入數百萬行?
開發人員通常做些什麼來讓他們的表有百萬行來測試他們的程序能夠以多快的速度處理它們?
我目前的方法有10個for循環,但它真的很慢我需要的行數。
那麼我能做些什麼來快速插入數百萬行?在這種情況下,專業開發人員會做什麼?
因此,爲了開發的目的,我需要一個大約有100萬到1億個值的表格,我目前的方法並不快。MySQL - 如何快速插入數百萬行?
開發人員通常做些什麼來讓他們的表有百萬行來測試他們的程序能夠以多快的速度處理它們?
我目前的方法有10個for循環,但它真的很慢我需要的行數。
那麼我能做些什麼來快速插入數百萬行?在這種情況下,專業開發人員會做什麼?
通常,插入的最慢部分正在更新索引。爲了加速批量插入,禁用索引,發送插入,然後重新啓用它們。
另外,使用多插入語法之一,而不是爲每個單獨的行發出INSERT
語句。
如何禁用索引?我假定它的ALTER TABLE tbl_name禁用鍵? – Debels
不禁用索引,請使用LOAD DATA命令 –
我猜您插入的記錄,像下面:
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
而是使用此:
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
("data1", "data2"),
("data1", "data2"),
("data1", "data2"),
("data1", "data2");
注:爲了優化插入速度,很多小的操作組合成一個大的操作。理想情況下,您建立一個連接,一次發送多個新行的數據,並延遲所有索引更新和一致性檢查直到最後。
這不是從你的問題明確您需要插入的數據的性質是什麼,但是如果它可以在最快的方式上生成,那麼在一個查詢中(這將插入1m的客戶)就像這樣做
INSERT INTO customers (id, customer_name)
SELECT n, CONCAT('Customer', n)
FROM
(
select a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + f.N * 100000 + 1 N
from (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) f
) t
這裏是SQLFiddle演示了10K行
推薦閱讀:
最快的解決方案是不加載所有數據,但從一個預先流行開始ulated數據目錄。
如果您只是爲開發/測試初始化數據,則根本不加載數據。從物理備份啓動一個新的MySQL實例。
您可以使用Percona XtraBackup對任何正在運行的MySQL實例進行物理備份,而不會阻塞流量。
然後準備備份,它的瞬間可作爲一個實時數據目錄。
然後,您可以像運行cp
一樣快速設置新測試實例來複制該數據目錄,並啓動mysqld實例,並將指定--datadir指定爲您的備份副本。
可以重複此,複製物理備份到儘可能多的開發/測試的情況下,因爲你需要。
第二個選項:不使用INSERT
,使用LOAD DATA INFILE
。與使用INSERT
相比,這可以比使用預準備語句和多行語法快一個數量級。
第三種選擇:準備批量數據爲CSV文件,將其移動到你的MySQL數據目錄,然後創建一個表ENGINE=CSV
指向該文件。瞧,你有一個充滿數據的桌子。然後使用ALTER TABLE ENGINE=InnoDB
並將其轉換爲真實的內部表格。
http://stackoverflow.com/q/1626059/40822 – dotjoe
@dotjoe我沒有一個文件加載到它:/ – Debels
您可以生成數據到一個文件,然後用它來加載到數據庫多次。 – dotjoe