2011-12-24 28 views
4

如果我有這樣的腳本:更新多行或記錄在數據庫

$sql = "SELECT * FROM table WHERE Status='0'"; 
$query = mysql_query($sql); 

    while ($row = mysql_fetch_array($query)) 
     $id = $row['ID']; 

      //......... 

     if($process->send()) { //after sent 
     mysql_query("UPDATE table 
         SET Status ='1' 
         WHERE ID = '$id'"); 
     } 
    } 

所以當過程done.But如果我有一萬多條記錄與Status='0'將更新的每一行,更新將變得緩慢。

那麼有沒有更好的方法來更新記錄?由於我需要知道每個進程是否完成,因此我無法使用單個查詢進行全部更新。

謝謝。

+1

更新一個體面索引的萬行表上的一行應該是即時的。每秒發送多少次更新到服務器? – 2011-12-24 13:14:54

+0

@Lieven它不是瞬間的,它總是需要幾毫秒。如果您嘗試每秒鐘執行1000次,那麼**會變慢,尤其是在使用大量索引時**,因爲它們必須在每次更新時重新計算。 – 2011-12-24 13:16:01

+0

將整個任務推到另一個線程中。對其進行簡化。將它切換到另一個線程,但只需執行狀態爲0的下一個線程,並將您的表用作隊列。 – 2011-12-24 13:17:38

回答

10

將所有成功的人添加到一個數組,並簡單地同時提交所有這些。

if ($process->send()) { 
    $done[] = $id; 
} 

和稍後:

mysql_query('UPDATE table SET Status=1 WHERE ID IN ('.implode(',', $done).')'); 
+0

+1,因爲如果服務器無法處理千次更新/秒(或者根據您解釋問題的方式更新數千記錄的表),則OP有其他問題。 – 2011-12-24 13:32:48

+0

需要注意的是,如果物品太多,IN的性能會很差。我認爲OP必須嘗試兩種解決方案並進行比較。 – RageZ 2011-12-24 14:57:31

1

你必須要爲代碼的存儲過程。它工作速度非常快

+0

對於更新,存儲過程不會明顯更快,就像這樣簡單。 – 2011-12-24 13:36:16

+0

如何發送數組值來更新多行? – MajidTaheri 2012-05-03 19:28:16