2011-01-14 37 views
0

我的應用程序(使用MySQL)正在執行大量的後續upserts。現在我的SQL是這樣的:儘可能快地做大量的upserts

INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL OR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 

到目前爲止,我發現INSERT IGNORE是實現upserts的最快方式。選擇一個記錄來查看它是否存在,然後更新它或插入一個新記錄太慢。即使這不是我想要的那麼快,因爲我需要爲每條記錄做一個單獨的聲明。有時候我會有大約5萬個這樣的陳述。

有沒有辦法在一條語句中處理所有這些事情,而不刪除任何現有記錄?

回答

0

您可以將所有內容放入1插入 INSERT IGNORE INTO table_1 (field1, field2) VALUES ('val1', 'val2'), ('val3', 'val4'), etc。如果您需要更新或插入記錄,則可能還需要檢查INSERT ... ON DUPLICATE KEY UPDATE

+0

如果我這樣使用'INSERT IGNORE',如果只有一條記錄存在,是不是會忽略整個查詢?不幸的是,由於需要長時間解釋的原因,我不能使用'ON DUPLICATE KEY UPDATE'。 –

+0

'如果使用IGNORE關鍵字,則執行INSERT語句時發生的錯誤將被視爲警告。例如,如果沒有IGNORE,表中重複表中現有UNIQUE索引或PRIMARY KEY值的行會導致重複鍵錯誤,並且語句會中止。使用IGNORE時,該行仍未插入,但未發出錯誤。' – dkarp

+0

'REPLACE INTO'也是一個選項,但由於它刪除並替換了現有的行,因此可能效率低於INSERT IGNORE。 – dkarp