我运营的网站上有视频。我希望所有用户都可以随时使用每视频观看次数。
通常情况下,我会使用以下内容:
UPDATE videos SET views = views+1 WHERE id = ...
有没有更快和/或更好的方法?
答案 0 :(得分:3)
除非您使用事务/锁来处理它们,否则这种特殊方式会受到并发错误的影响。
我会更倾向于点击次数:
INSERT DELAYED INTO video_hits (video_id, time) VALUES (:video_id, NOW());
通过这种方式,您可以获得计数,但也可以获得有关视图的统计信息。
注意:DELAYED
仅适用于MyISAM,这很好,因为它会立即返回,而COUNT(*)
在MyISAM表上很快。您可以省略InnoDB。
答案 1 :(得分:1)
是的。使用Memcached。 http://www.php.net/manual/en/memcached.increment.php
然后编写一个cron脚本,它会在一段时间内将更改后的值写入表中,以防万一。我不认为查看计数是一个特别重要的信息 - 在服务器崩溃的情况下丢失几分钟的数据应该没问题。
Redis也是一个选项,虽然设置起来比较困难。作为奖励,您将获得持久性和排序集,因此根本不需要涉及MySQL。
如果你真的需要在InnoDB中使用MySQL,那么你唯一的选择就是摆弄innodb_flush_log_at_trx_commit
,但这有点危险。 MyISAM根本不起作用(它会为每次写入锁定整个表格)。