MySQL - Как реализовать уникальную систему просмотра?

0

Введение

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

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

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

  • Когда пользователь посещает, я делаю 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

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

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

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

(Обязательно избегайте этих переменных php, чтобы избежать SQL-инъекции.)

Теперь вы обновляете свою таблицу журналов только одним запросом. Затем вы можете периодически обновлять поле views в 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 часов или что-то еще. Это будет немного меньше, если у вас есть куча видео, которые часто не посещаются.

  • 0
    Оба ваших предложения имеют большой смысл, единственная проблема, которую я вижу со вторым, заключается в том, что он не очищает журнал ... поэтому каждый раз, когда он выполняется, он будет считать результаты независимо от того, были ли они уже подсчитаны. Я предполагаю, что у меня есть два варианта ... иметь срок жизни журнала, равный тому, когда обновляются представления (путем очистки журнала при подсчете просмотров) ИЛИ путем добавления подсчитанного поля, чтобы остановить подсчет журнала несколько раз. Как вы думаете?
  • 0
    Да, результаты подсчитываются независимо от того, были ли они подсчитаны. Но это не ДОБАВЛЯЕТ, что счет к существующему счету - он заменяет существующий счет.
Показать ещё 3 комментария
1

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

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

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

Это потребует, чтобы у вас было ограничение UNIQUE для столбцов IP и video_id.

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

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

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

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

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

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

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

  • 0
    извините, я не понимаю ваше первое предложение ... как наличие ON DUPLICATE KEY UPDATE означает, что мне не нужно очищать журнал? Вы имеете в виду, что выполнение SQL будет быстрее, потому что ГДЕ нет, и поэтому мне не нужно очищать журнал?
  • 0
    Да это верно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню