在没有锁定MySQL的情况下更新整个表

时间:2011-04-08 10:15:52

标签: mysql locking

运行此更新语句将锁定表中的每一行5秒钟。

UPDATE `audio_clips` SET activity = activity * 0.95;

有没有办法批处理(mysql内部),或者在没有锁定的情况下执行语句?

这是一个用于显示网站上当前流行内容的字段(如Reddit,Hacker News等)。每当播放audio_clip时,活动就会被一个人撞到。我们会定期'衰减'每个剪辑的活动。我不打算原子地更新,只要每一行都被腐烂。

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分:1)

最终,我最终分批进行。它可能不是完全可扩展的,但是在1000个批次中,每个记录约为35ms。整个过程每小时只需10秒钟。

足够好。