2011-04-22 30 views
4

我有一張需要定期更新的表格。這些更新分批發生。與INSERT不同,我不能在單個查詢中包含多行。我現在所做的是準備UPDATE語句,然後遍歷所有可能性並執行每個可能性。當然,準備工作只發生一次,但仍有很多處決。有沒有一種巧妙的方法來彌補MySQL的更新?

我創建了不同大小的表的幾個版本(認爲可能更好的索引或拆分表會有所幫助)。但是,這對更新時間沒有影響。對於1,000行或500,000行,100次更新大約需要4秒。

有更明智的方法可以更快地做到這一點嗎?

正如評論中所述,這裏是我一直在測試的實際代碼(PHP)。列'id'是主鍵。

$stmt = $dblink->prepare("UPDATE my_table SET col1 = ? , col2 = ? WHERE id = ?"); 
$rc = $stmt->bind_param("ssi", $c1, $c2, $id); 
foreach ($items as $item) { 
    $c1 = $item['c1']; 
    $c2 = $item['c2']; 
    $id = $item['id']; 
    $rc = $stmt->execute(); 
} 
$stmt->close(); 
+0

「100次更新需要4秒」? - 你確定?這是非常差的表現 – 2011-04-22 04:10:28

+0

這可能只是一個網絡問題。實際的代碼和數據庫位於不同的機器上。 – burger 2011-04-22 04:14:46

+0

檢查您的索引。確保無論您將更新語句的where子句放入索引。 – squawknull 2011-04-22 04:18:54

回答

2

如果你真的想這樣做,一個很大的語句,一個缺憾方法是使用INSERT語句的「關於重複鍵」功能,即使所有的行應該已經存在,並且每一行都會有重複的密鑰更新。

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) 
    ON DUPLICATE KEY UPDATE 1=VALUES(a), b=VALUES(b), c=VALUES(c); 
2

嘗試LOAD DATA INFILE。比MySQL INSERT或UPDATES快得多,只要你能以平面格式獲取數據。

相關問題