@li_gang_chi

Php+Mysql. Минимизация кл-во запросов, для подсчета просмотров, как?

Есть сайт php + mysql + yii2.
Суть: нужно считать кл-во раз сколько был показан каждый пост из списка.

Есть категорийные страницы, где списком(например по 20) выводяться посты.
В таблице постов есть поле views, которое хранит кол-во сколько раз пост был показан.
Именно показан в списке, а не сколько раз перешли и посмотрели сам пост(один), это важно.

При каждом выводе такого списка нужно обновить поле views++ для каждого из постов в списке.

Например если мы выводим списки по 20 постов мы делаем 20 запросов UPDATE в базу. Каждый раз когда такой список выводится.

Сейчас так у меня это и работает. Но при трафике 6к+ человек в сутки, плюс поисковые боты. Это не самое лучшее решение. Один такой запрос отрабатывает относительно быстро - 0.2 ms. Но сама таблица постов содержит 57к записей, и каждая запись имеет 23 поля. Время ответа сервера падает почти на 1сек

Какое оптимальное решение можно использовать чтобы уменьшить нагрузку на базу, и соответсвенно увеличить время ответа сервера?

Из идей пока только такое приходит в голову:
  1. Хранить гдето(например в $_SESSION) показы, и раз в 10 минут переносить данные в базу и обнулять информацию в сессии. Но тут тоже, за 10 мин там насобирается очень много постов и они не просто будут харнится а еще и постоянно обновляться информация(сколько раз был показан пост).Так что не уверен что будет профит по скорости\оптимизации.
  2. Считать уже на фронте, брать айди всех постов и одним ajax запросом обновлять.
  3. По мере роста трафика переходить на более мощный сервер. Но это дорого по деньгам, т.к. не будет соответсвовать трафик сайта и мощность сервера. Покупать мощный сервер только для одной фишки - дорого. На данный момент текущего сервера хватает с огромным запасом.


UPD: В моем конкретном случае точность не важна. Можно допускать не большую погрешность в подсчете.
  • Вопрос задан
  • 223 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Stalinko
PHP'шник и фрилансер до мозга костей
А зачем делать 20 UPDATE запросов, если можно сделать 1 запрос? :)

Просто указать все ID списком:
UPDATE posts SET views = views + 1 WHERE id IN (1,2,3,5)
Ответ написан
Kozack
@Kozack
Thinking about a11y
Кроме ответа Илья С, можно уменьшить точность подсчетов. Это подходит для ситуаций когда много трафика и 100%-я точность показателей не нужна. Например, допустимая погрешность = ±5 просмотров. Тогда можно делать обновление не при каждом посещении, а примерно раз в 5 посещений и обновлять просмотры не на +1 а на +5.
Даже с погрешностью ±5 просмотров вы уменьшите количество обновлений БД на 80%. А Увеличивая допустимую погрешность (±10, ±50, ±100) можно ещё сильнее уменьшить нагрузку.
Ответ написан
cr1gger
@cr1gger
Все дороги ведут в Рим — встретимся в Риме!
Опоздал, ну ладно...
UPDATE articles 
SET view = view+1
WHERE id IN (1,2,3);
Ответ написан
Комментировать
Вот тут есть мысли по поводу организации счётчиков в Mysql
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы