MySQL - Как реализовать уникальную систему просмотра? - PullRequest
0 голосов
/ 03 декабря 2009

Введение

Мне интересно, как лучше внедрить систему уникальных представлений ... Я думаю, что знаю, как, поэтому, если бы я мог объяснить, как я думаю, чтобы сделать это, и вы укажете на любые ошибки или улучшения.

очевидно, мне придется хранить таблицу журнала, содержащую идентификатор видео и что-то, что (относительно) однозначно идентифицирует пользователя. Сначала я рассмотрел комбинацию запроса заголовка и IP, но решил сделать его простым и использовать только IP. Также таким образом пользователь не может увеличить количество просмотров своего видео с помощью другого браузера.

Вот как я мог бы это сделать:

  1. Когда пользователь посещает, я делаю SELECT похож на это:

    SELECT 1 FROM tbl_log WHERE IP = $usersip AND video_id = $video_id

    • если нет результата, тогда я должен вставить запись

    INSERT into tbl_log (IP,video_id) VALUES ($usersip, $video_id)

    • и увеличить количество просмотров на 1

    SELECT views FROM tbl_video WHERE video_id = $video_id

    UPDATE tbl_video SET views = $result['views'] + 1 WHERE video_id = $video_id

Вопросы

  • Я думаю, я не хочу иметь
    миллионы записей журнала замедляются мой сайт, так что я должен запустить работу cron для очищать таблицу журнала один раз в день?

  • Должен ли я сделать взгляды
    на транзакциях? (Я думаю, немного
    количество устаревших просмотров меньше
    важно, чем медленный сайт из-за рядные замки)

  • Есть ли способ уменьшить нагрузку на сервер MySQL .... боюсь, если каждый просмотр требует увеличенного количества просмотров и журнал IP, что это будет довольно дорого. Я видел, что YouTube
    и тому подобное не обновлять представления мгновенно ... они кешируют
    обновляет некоторые как, а затем запустить их на один раз? если да как?

  • Насколько эффективна моя система? Ты можешь думаете о каких-либо улучшениях?

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Думаю, я не хочу иметь миллионы записей в журнале замедляют мой сайт, поэтому я должен запустить cron работа по очистке таблицы журнала один раз в день?

Подумайте об использовании синтаксиса ON DUPLICATE KEY UPDATE в mysql, чтобы избежать использования SELECT с дорогостоящим предложением WHERE. Если в вашей таблице журнала также есть столбец отметки времени, вы можете обновить это значение.

INSERT into tbl_log (IP,video_id) VALUES ($usersip, $video_id) ON DUPLICATE KEY UPDATE time_recorded = now();

Это потребует от вас УНИКАЛЬНОГО ограничения на столбцы IP и video_id.

Должен ли я сделать представления транзакционными? (Я думаю, слегка обесцененный вид счет менее важен, чем медленный сайт из-за блокировки строк)

Нет, потому что вы можете достичь этого с помощью одного запроса UDPATE.

UPDATE tbl_video SET views = views + 1 WHERE video_id = $video_id

Есть ли способ уменьшить нагрузку на сервер MySQL .... боюсь, если каждый просмотр требует увеличенного количества просмотров и журнал IP, что это будет довольно дорого. Я видел, что YouTube и тому подобное не обновлять представления мгновенно ... они кешируют обновления кто-то как, а потом запустить их сразу? если ну и как?

Это не так уж плохо - на самом деле нет другого способа надежного захвата данных для просмотра записей. В случае Youtube более вероятна задержка записи или репликации, что приводит к задержке, которую вы заметили, поскольку они имеют сотни серверов (хотя, возможно, они также кэшируют значение)

Насколько эффективна моя система? Ты можешь думаете о каких-либо улучшениях?

Кроме того, что я здесь уже упомянул, не с моей головы.

1 голос
/ 03 декабря 2009

Вот несколько идей по улучшению, которые вы можете сделать.

Установите первичный ключ в tbl_log равным IP + video_id. Тогда вы можете просто сделать

 REPLACE INTO tbl_log (IP,video_id) VALUES ($usersip, $video_id)

(Обязательно экранируйте эти переменные php, чтобы избежать внедрения SQL.)

Теперь вы обновляете свою таблицу журнала только одним запросом. Затем вы можете периодически обновлять поле представлений в tbl_video, например:

UPDATE tbl_video SET views = (select count(*) from tbl_log where video_id = $video_id) where video_id = $video_id

Вы можете сделать это с помощью задания cron или добавить поле 'last_count_update' и обновлять видео, когда оно доступно, если время последнего подсчета старше 2 часов или что-то еще. Это будет немного меньше работы, если у вас есть куча видео, которые не посещаются часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...