Отслеживание просмотров данной строки - PullRequest
0 голосов
/ 26 ноября 2009

У меня есть сайт, где пользователи могут просматривать довольно большое количество постов. Каждый раз, когда это делается, я запускаю запрос, похожий на UPDATE table SET views=views+1 WHERE id = ?. Однако у этого подхода есть ряд недостатков:

  • Нет способа отслеживать, когда происходят просмотры страниц - они просто увеличиваются.
  • Обновление таблицы, которая, насколько я понимаю, часто очищает кеш MySQL строки, тем самым замедляя следующий SELECT этой строки.

Поэтому я рассматриваю использование подхода, в котором я создаю таблицу, скажем:
object_views { object_id, year, month, day, views }, так что каждый объект имеет одну строку pr. день в этой таблице. Затем я бы периодически обновлял столбец представлений в таблице objects, чтобы мне не приходилось все время делать дорогие объединения.

Это самое простое решение, которое я могу придумать, и, похоже, оно также оказывает наименьшее влияние на производительность. Вы согласны?

(Если вам интересно, сайт построен на PHP 5.2, symfony 1.4 и Doctrine 1.2)

Edit:
Цель - , а не веб-аналитика - я знаю, как это сделать, и это уже на месте. Есть две цели:

  • Разрешить пользователю видеть, сколько раз данный объект был показан, например, сегодня или вчера.
  • Разрешить модераторам сайта просто просматривать статистику, не заходя в Google Analytics, Omniture или любое другое решение. Кроме того, результаты в бэкэнде должны быть в реальном времени, функция, которую GA не может предложить в настоящее время. Я не хочу использовать API Analytics для извлечения данных об использовании (не в реальном времени, GA требует JavaScript).

Ответы [ 4 ]

1 голос
/ 26 ноября 2009

Цитата: Обновление таблицы, которая, насколько я понимаю, часто очищает кеш MySQL строки, тем самым замедляя следующий SELECT этой строки.
Существует гораздо больше, чем это. Это убийца базы данных. Я предлагаю вам сделать стол так: object_views {object_id, timestamp} Таким образом, вы можете агрегировать по object_id (count ()). Поэтому каждый раз, когда кто-то просматривает страницу, вы вставляете запись в таблицу. Время от времени вы должны очистить старые записи в таблице. ОБНОВЛЕНИЕ заявление ЗЛО :) На большинстве платформ он в основном помечает строку как удаленную и вставляет новую, тем самым делая таблицу фрагментированной. Не говоря уже о проблемах с блокировкой.

Надеюсь, что поможет

0 голосов
/ 26 ноября 2009

В том же духе, что и в Rage, вы просто не добьетесь того же результата, если будете делать это самостоятельно, когда существует миллион инструментов сторонних журналов. Если вы отслеживаете ежедневно, то базовая программа, такая как webtrends, вполне способна отследить попадания, особенно если ваш URL содержит идентификаторы элементов, которые вы хотите отслеживать ... Я не могу подчеркнуть это достаточно, это все об URL, когда речь заходит об этих инструментах (например, Wordpress допускает множество различных конструкций URL)

Теперь, если вы ищете отслеживание "впечатлений", то это еще одна игра с мячом, потому что вы, вероятно, отслеживаете каждый объект, страницу, пользователя и, возможно, взвешенное значение в зависимости от местоположения на странице. Если это так, вы можете сохранить свою производительность, разместив отслеживание на другом сервере, где вы можете запустить и забыть. В прошлом я работал над этим, используя обновление SQL для идентификатора и строковой версии даты ... таким образом, когда дата изменяется с 20091125 на 20091126, это простой запрос без дополнительных затрат, скажем, с функцией datediff.

0 голосов
/ 26 ноября 2009

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

В выпуске datetime вы всегда можете использовать GROUP BY MONTH( accessed_at ) , YEAR( accessed_at) или WHERE MONTH(accessed_at) = 11 AND YEAR(accessed_at) = 2009.

0 голосов
/ 26 ноября 2009

Сначала просто быстрое замечание, почему бы не объединить год, месяц, день в DATETIME, это будет иметь больше смысла в моей голове.

Кроме того, я не совсем уверен, какова точная причина, по которой вы это делаете, если для целей маркетинга / веб-статистики вам лучше использовать инструмент, созданный для этой цели.

В настоящее время существует два больших семейства инструментов, способных дать вам представление о статистике доступа к вашему веб-сайту: журнал на основе журнала ( awstats , вероятно, самый популярный), ajax / 1-пиксельное изображение на основе (* 1008) * Google Analytics будет самым популярным).

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

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

...