2011-10-04 44 views
2

我有3,000多家行的陣列fomrated這樣MySQL的:使用一個查詢多行更新

$COUNTS = array(
1=>5, 
2=>22, 
3=>120, 
4=>0, 
.... 
); 

其中鍵代表一個ID和值是計算的COUNT ...

我需要使用這些新值(用PHP)來更新我的表中的所有行...

所以現在我更新逐一 (簡體),如

foreach($COUNTS as $id=>$count){ 
mysql_query("UPDATE categories SET count=$count WHERE id=$id"); 
} 

,我需要讓3,000多家查詢,做一個簡單的更新....

這可以在一個查詢完成或任何其他不消耗資源的方式是什麼?也許生成一個csv文件,並在飛行或更新?

+0

您可以嘗試使用XML,請參閱[在XML中使用XML](http://www.kitebird.com/articles/mysql-xml)中的「使用XML :: Parser讀取XML」一節。 html) –

回答

1

你可以嘗試像

UPDATE categories c 
INNER JOIN 
(
    SELECT 1 as id, 23 as `cnt` 
    UNION 
    SELECT 2 as id, 25 as `cnt` 
    -- UNION etc 
)a 
ON c.id = a.id 
SET c.`count` = a.cnt 
+0

結果大致相同......它仍然需要大約9秒才能完成。 –

+1

我認爲它應該會更好一點,至少你執行1個查詢,而不是3k – a1ex07

+0

是的,有點,大約3%提高...我需要至少70%的提高 –

1

看起來你可能已經想通了這一點,但一對夫婦的建議,反正。如果您正在進行大型更新(尤其是一次或很少),請確保禁用了任何觸發器(如果不是必需的話)以及索引。雖然索引似乎不是你的問題。

你當然可以讓你的查詢循環。對於3000條記錄,9s似乎很高,但取決於還在發生什麼,這可能是好的。

您也可以將數據寫入一個文件,然後進行本體通過

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table; 

看到http://dev.mysql.com/doc/refman/5.5/en/load-data.html參考文件插入一個新表。然後您將不得不加入這兩個表格進行更新。在這種情況下你必須處理文件IO和另一個數據庫連接,所以不知道你會得到多少節省。

另一種選擇是創建一個準備好的語句並將參數綁定到它。這應該會更快一點。查看http://us2.php.net/manual/en/mysqli.prepare.php獲取更多信息