运行此更新语句将锁定表中的每一行5秒钟。
UPDATE `audio_clips` SET activity = activity * 0.95;
有没有办法批处理(mysql内部),或者在没有锁定的情况下执行语句?
这是一个用于显示网站上当前流行内容的字段(如Reddit,Hacker News等)。每当播放audio_clip时,活动就会被一个人撞到。我们会定期'衰减'每个剪辑的活动。我不打算原子地更新,只要每一行都被腐烂。
答案 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秒钟。
足够好。