2012-08-03 49 views
4

好吧,我得約175K的INSERT語句,相當大的INSERT語句,例如:Mysql的更快INSERT

INSERT INTO `gast` (`ID`,`Identiteitskaartnummer`,`Naam`,`Voornaam`,`Adres`,`Postcode`,`Stad`,`Land`,`Tel`,`Gsm`,`Fax`,`Email`,`Creditcardnummer`) VALUES ('100001','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','[email protected]','8378-3645-3748-8446'); 

(忽略的事實,這是荷蘭)。所有的數據都是完全隨機的。

我必須這樣做大約3到4次。查詢100k INSERT語句需要大約一個小時在我的電腦上。有沒有辦法在不改變INSERT語句的情況下更快地執行此操作?我正在使用MySQL Workbench。謝謝。

編輯

我用盡了一切建議爲止。只使用一個INSERT,但多個VALUES給我一個INSERT語句太大的錯誤。在插入之前禁用索引也不會提高性能。

我也嘗試通過加載命令行的SQL文件,但是,這並不無論做任何事......

插入性能會有所不同,從0.015s到0.032s每個刀片。

+0

刪除索引在插入之前的桌子上將顯着改善表現 – 2012-08-03 11:19:14

+0

這需要一個小時,可能意味着你做錯了什麼。用它包裝一個事務並使用參數化的SQL! – usr 2012-08-03 11:22:12

回答

2

INSERT的所有數據到一個表 - 中表你將用 - 給你的數據庫加上種子 - 然後發出一個INSERT SELECT語句,因爲它會以一批而不是175K不同的語句執行它。

此外,當您使用INSERT SELECT語句爲數據庫添加種子時,請關閉目標表ALTER TABLE yourtablename DISABLE KEYS上的限制,然後再打開ALTER TABLE yourtablename ENABLE KEYS

我也會親自在種子數據表上建立covering index,因爲那樣它就不必讀取數據頁面。

+0

「將所有數據插入到一個表中」。但是,這是需要這麼長時間.. – Matthias 2012-08-03 11:51:39

+0

@Matthias是的,但你只需要這樣做一次,然後你就可以將數據庫從這張表中繼續。如果你不想走這條路,那麼你可以嘗試使用我的第二條建議,關閉約束,並以這種方式執行所有175K INSERT語句。無論哪種方式,問題是您要求服務器執行175K INSERT語句,並可能在沒有爲此構建的機器上。 – 2012-08-03 11:53:35

+0

禁用密鑰並不能提高性能。它保持不變。 – Matthias 2012-08-03 13:00:03

1

只需使用一個語句

INSERT INTO `gast` 

    (`ID`,`Identiteitskaartnummer`,`Naam`,`Voornaam`,`Adres`,`Postcode`,`Stad`,`Land`,`Tel`,`Gsm`,`Fax`,`Email`,`Creditcardnummer`) 
    VALUES 
    ('100001','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','[email protected]','8378-3645-3748-8446'), 
    ('100002','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','[email protected]','8378-3645-3748-8446') 

等等等等....

也許你應該做的10000時間,而不是所有的175K

+1

太糟糕了: 錯誤代碼:1153。有一個大於'max_allowed_pa​​cket'字節的數據包 另外:「沒有編輯INSERT語句」。 – Matthias 2012-08-03 11:48:33

+0

你究竟在做什麼?將數據從一個表插入另一個表? – arnoudhgz 2012-08-03 12:00:18

+0

用隨機數據生成一堆INSERT語句,然後插入這些語句。 – Matthias 2012-08-03 12:01:34

1

另一種解決方案是將數據保存到一個文本文件,然後使用LOAD DATA LOCAL INFILE加載數據

它可能不是很好,但它會更快

1

把所有的數據在一個csv文件和用戶載入數據文件FILENAME到表中表 它不會花費一分多秒 如果你想要插入它最好使用一個插入一次發送幾行