動画を掲載しているサイトを運営しています。すべてのユーザーがいつでも利用できるビデオごとのビュー カウントが必要です。
通常、次のようなものを使用します。
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 では省略できます。
Yep. Use Memcached. http://www.php.net/manual/en/memcached.increment.php
Then write a cron script that will write the changed values to the table once in a while, just in case. I don't think view count is a particularly important info - losing a few minutes of data in case of a server crash should be fine.
Redis is an option, too, although it's harder to set up. As a bonus you'd get persistence and sorted sets, so no need to involve MySQL at all.
If you really need to use MySQL with InnoDB, your only option is to fiddle with innodb_flush_log_at_trx_commit
, but that's kind of dangerous. MyISAM won't work at all (it locks the entire table for every write).