2011-04-08 23 views
7

運行此更新語句將鎖定表中的每一行5秒鐘。在MySQL中更新未鎖定的整個表格

UPDATE `audio_clips` SET activity = activity * 0.95; 

有沒有一種方法可以批量執行(內部爲mysql),或執行沒有鎖定的語句?

這是一個字段,用於顯示當前在網站上流行的內容(如Reddit,黑客新聞等)。無論何時播放audio_clip,活動都會碰撞一次。定期,我們'腐爛'每個剪輯的活動。只要每行都衰減,我不會爲更新原子而煩惱。

+0

表是MyISAM還是InnoDB?你爲什麼要更新所有的記錄,或者這只是一個錯字?您在發佈的SQL語句中缺少WHERE子句。 – 2011-04-08 10:19:58

+0

InnoDB。我正在更新每條記錄,因爲我將按列排序。我需要流行的物品上榜,以及不再流行的物品才能上榜。 – skattyadz 2011-04-08 10:25:02

回答

1

最後,我結束了在分批做。它可能不是完全可擴展的,但是每1000個批次中,每個記錄約束35ms。整個過程只需要每個小時10秒。

夠好。

4

我肯定會採取不同的方法。

難道可以在播放剪輯時設置時間戳,並且在碰撞之後計算自該時間戳以來的衰減?在讀出統計數據時,應該將活動減去自上次時間戳以來的衰減。

這樣你仍然只需要每播放一個剪輯更新一次。

爲了使它混凝土:

UPDATE `audio_clips` SET `lastview`=UNIX_TIMESTAMP(), 
        `activity`=1+`activity`*POW(0.9,(UNIX_TIMESTAMP()-`lastview`)/3600) 
       WHERE `clipid`=$clipid 

對於每小時10%的衰減和1的凸塊每視圖。

要查看當前統計:

SELECT *,`activity`*POW(0.9,(UNIX_TIMESTAMP()-`lastview`)/3600) AS `current_activity` 
     FROM `audio_clips` 
+0

我喜歡這種方法,但是如果我打算按列排序,我仍然需要對非活動剪輯進行批量衰減,對嗎? – skattyadz 2011-04-08 10:28:08

+0

不,您可以按任何表達式排序,也可以計算當前活動。 – mvds 2011-04-08 10:28:55

+1

嗯。它可能需要積極的緩存,因爲它無法使用索引。如果我告訴你我們正在談論約350,000行,它會有所作爲嗎? – skattyadz 2011-04-08 10:33:18