2009-09-21 75 views
0

我有一個每週更新自己的腳本。我從我的託管服務器收到警告,說我已經用腳本超載了服務器。我收集的問題是,我使用了太多的UPDATE查詢(每個8000+用戶都有一個)。添加更新SQL查詢

這是壞的編碼,我知道。所以現在我需要將所有數據合併到一個SQL查詢中並一次性更新。我希望這將解決我的問題。

一個簡短的問題。如果我添加純加UPDATE查詢,通過這樣一個分號隔開:

UPDATE table SET something=3 WHERE id=8; UPDATE table SET something=6 WHERE id=9; 

,然後更新一個大的SQL代碼數據庫,而不是查詢數據庫對於每個更新,它會更快嗎?

這是將「聚合」UPDATE語句的最佳方式嗎?這會顯着減少服務器負載嗎?

+0

您是否有可用的存儲過程? – 2009-09-21 17:05:48

+1

你爲什麼要做這樣的事情?如果你能解釋這種情況,那麼可能會出現更好的解決方案。 – shahkalpesh 2009-09-21 17:05:53

+0

我運行http://www.tweekly.fm。這是一個每週從last.fm發送推文的mashup。所以每個星期我都會更新數據併發送推文。我存儲用戶頁面的樂隊名稱。這就是爲什麼我必須每週更新用戶數據。 – 2009-09-21 17:08:33

回答

0

它會改善IO,因爲只有一次往返,但數據庫的「努力」將是相同的。

1

最好的辦法是批量這些語句由你的「東西」字段:

UPDATE table SET something=3 WHERE id IN (2,4,6,8) 
UPDATE table SET something=4 WHERE id IN (1,3,5,7) 

當然,知道也不關心你的要求,有可能是一個更好的解決方案有...

+0

沒有抱歉。這是行不通的。每個用戶都有獨特的數據... – 2009-09-21 17:27:33

+0

然後你需要用它做獨特的事情,在這種情況下,你需要獨特的查詢。有時間拿出您的信用卡並致電您的託管服務提供商! – 2009-09-21 17:45:27

2

用你的值創建一個分隔文件,並使用你的等價的MySQL的LOAD DATA INFILE。這將比UPDATE快得多。

LOAD DATA INFILE '/path/to/myfile' 
REPLACE INTO TABLE thetable(field1,field2, field3) 
//optional field and line delimiters 
; 
0

SQL的好奇心是以下整數表達式 (1個-abs(符號(A - B)))= 1,如果A == B和否則爲0。爲了方便起見,我們稱這個表達式爲_eq(A,B)。 所以

update table set something = 3 * _eq(id,8)+ 6 * _eq(id,9) where id in(8,9);

將使用單個更新語句執行您想要的操作。