2014-04-16 57 views
2

我正在執行數千次循環內的更新查詢。使用單個查詢來更新多條記錄以提高性能

一切順利,但問題在於所有更新都需要大量時間。

如果我串聯/結合所有更新查詢在這樣一個字符串:

$update_query = ""; 
while(condition) 
{ 
    $update_query = $update_query . " update table set ... ; "; 
} 

然後執行$ update_query單的時候,這將是有幫助嗎?

還有什麼我可以做更好的表現?任何暗示或建議?

+1

確保您使用的是行級鎖(存儲引擎InnoDB的是或其他與行級鎖定,myisam沒有這樣的),你有一個索引在你的where子句(在最好的情況下 - 一個唯一的索引)。您也可以關閉自動提交,並立即提交... –

回答

2

您可以使用INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO table (id, value) VALUES (1, 'value1'), (2, 'value2') 
ON DUPLICATE KEY UPDATE 
value = VALUES(value) 
+0

聽起來不錯!它會檢查主鍵的重複還是重複整行? – Vitthal

+1

@Vitthal它會檢查任何唯一索引的重複,而不是整行 –

+0

@Darhazer謝謝!這對我有效。它比正常的多個更新快得多。 – Vitthal

2

什麼你要找的是一個批量更新查詢,是這樣的:

UPDATE mytable 
SET myfield = CASE other_field 
    WHEN 1 THEN 'value' 
    WHEN 2 THEN 'value' 
    WHEN 3 THEN 'value' 
END 
WHERE id IN (1,2,3) 
+0

這將是好的,但我有成千上萬的記錄,每次更新將更新多列,在這種情況下,它會變得困難。 – Vitthal