運行此更新語句將鎖定表中的每一行5秒鐘。在MySQL中更新未鎖定的整個表格
UPDATE `audio_clips` SET activity = activity * 0.95;
有沒有一種方法可以批量執行(內部爲mysql),或執行沒有鎖定的語句?
這是一個字段,用於顯示當前在網站上流行的內容(如Reddit,黑客新聞等)。無論何時播放audio_clip,活動都會碰撞一次。定期,我們'腐爛'每個剪輯的活動。只要每行都衰減,我不會爲更新原子而煩惱。
運行此更新語句將鎖定表中的每一行5秒鐘。在MySQL中更新未鎖定的整個表格
UPDATE `audio_clips` SET activity = activity * 0.95;
有沒有一種方法可以批量執行(內部爲mysql),或執行沒有鎖定的語句?
這是一個字段,用於顯示當前在網站上流行的內容(如Reddit,黑客新聞等)。無論何時播放audio_clip,活動都會碰撞一次。定期,我們'腐爛'每個剪輯的活動。只要每行都衰減,我不會爲更新原子而煩惱。
最後,我結束了在分批做。它可能不是完全可擴展的,但是每1000個批次中,每個記錄約束35ms。整個過程只需要每個小時10秒。
夠好。
我肯定會採取不同的方法。
難道可以在播放剪輯時設置時間戳,並且在碰撞之後計算自該時間戳以來的衰減?在讀出統計數據時,應該將活動減去自上次時間戳以來的衰減。
這樣你仍然只需要每播放一個剪輯更新一次。
爲了使它混凝土:
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`
表是MyISAM還是InnoDB?你爲什麼要更新所有的記錄,或者這只是一個錯字?您在發佈的SQL語句中缺少WHERE子句。 – 2011-04-08 10:19:58
InnoDB。我正在更新每條記錄,因爲我將按列排序。我需要流行的物品上榜,以及不再流行的物品才能上榜。 – skattyadz 2011-04-08 10:25:02