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