2

我经营一个网站,上面有视频。我想要一个所有用户随时都可以使用的每个视频的观看次数。

通常我会使用以下内容:

UPDATE videos SET views = views+1 WHERE id = ... 

有没有更快和/或更好的方法?

4

2 回答 2

3

除非您使用事务/锁来处理它们,否则这种特定方式会受到并发错误的影响。

我会更倾向于命中计数,例如:

INSERT DELAYED INTO video_hits (video_id, time) VALUES (:video_id, NOW());

这样,您可以获得计数,还可以获得一段时间内的观看次数统计信息。

注意:这DELAYED仅适用于 MyISAM,这很好,因为它会立即返回,并且COUNT(*)在 MyISAM 表上速度很快。对于 InnoDB,您可以省略它。

于 2012-09-17T02:10:57.500 回答
1

是的。使用 Memcached。 http://www.php.net/manual/en/memcached.increment.php

然后编写一个 cron 脚本,它会不时将更改的值写入表中,以防万一。我不认为查看次数是一个特别重要的信息——在服务器崩溃的情况下丢失几分钟的数据应该没问题。

Redis 也是一种选择,尽管它更难设置。作为奖励,您将获得持久性和排序集,因此根本不需要涉及 MySQL。

如果您确实需要将 MySQL 与 InnoDB 一起使用,您唯一的选择就是摆弄 . innodb_flush_log_at_trx_commit,但这有点危险。MyISAM 根本不起作用(每次写入都会锁定整个表)。

于 2012-09-17T02:15:43.447 回答