Лучшая практика для ведения контр-статистики? - PullRequest
2 голосов
/ 11 мая 2011

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

Кажется, самый простой способ отслеживать это просто иметь целочисленный столбец в таблице.Например, у каждой страницы есть столбец просмотра страниц, который увеличивается на 1 для каждого просмотра.Похоже, что это может быть проблемой, если люди переходят на страницу быстрее, чем может написать база данных.

Если, например, два человека одновременно заходят на страницу, то счет previous_pageview будет одинаковымдо обоих обновлений, и каждое обновление будет обновлять его до previous_pageview+1, а не +2.Однако, если предположить, что скорость записи в базу данных составляет 10 мс (я думаю, что она действительно высока), вам потребуется порядка ста просмотров страниц в секунду или миллионов просмотров страниц в день.

Хорошо, тогдадля меня просто увеличивать столбец?Точное число не слишком важно, поэтому некоторые ошибки здесь и там терпимы.Замедляется ли оператор обновления в одном столбце, если в одной строке много столбцов?(Я предполагаю, что нет.)

Я планировал использовать отдельную базу данных No-SQL для хранения pk_[stat]->value пар для каждой статистики, быстро увеличивая их, а затем выполняя задание cron для периодического обновления MySQL.ценности.Это похоже на излишество;кто-нибудь, пожалуйста, убедите меня, что это так.

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

UPDATE foo SET counter = counter + 1 является атомным. Он будет работать, как и ожидалось, даже если два человека ударили одновременно.

3 голосов
/ 11 мая 2011

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

INSERT INTO page_view (page_id) VALUES (1);

...

UPDATE page SET views = views + new_views WHERE id = 1;

Это должно быть немного быстрее, чем X = X + 1, но требует немного больше работы.

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