Kianl
@Kianl
Печальный веб-разработчик

Как оптимизировать / кэшировать кучу тяжелых запросов к MySQL?

Привет тру-программистам.

Короче сделал я себе на сайте небольшую систему статистики. Выглядит она следующим образом:
5f61c884aa3e0180218524.jpeg

Работает на основе таблицы с просмотрами постов, куда заносятся реферер, дата и прочее. Но есть проблема: каждая из этих цифр рассчитывается отдельно - каждое кол-во просмотров, каждого источника + каждая динамика в сравнении с прошлым периодом (в скобках). Получается дофигища тяжелых запросов, из-за чего очень сильно тормозит загрузка списка постов в админке. Именно этот момент создает мне неудобства.

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

Максимум, что я смог придумать - это подгружать всю эту муть асинхронно аяксом. Тогда страница с постами будет шустро грузиться, но стату все равно придется ждать. Да и как быть с сортировкой например? Она от таких запросов тоже тормозит. Есть идеи у кого-нибудь, чего тут можно сделать?
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) Проверить индексы на таблицах, с такими объемами у вас все должно летать.
2) Кэширование используется на часто вызываемых запросах, где не критично отставание от точных хранимых данных в пределах некоторго заданного временного интервала, например список последних новостей на сайте изменяется не часто, а запрашивается постоянно, есть смысл хранить его в кеше хотя бы 15-30 минут. А у вас ситуация ровно обратная - запрос делается редко, и данные нужны актуальные.
3) к п.1 нужно соответственно добавить проверку, как работают запросы и используются индексы, explain в руки и вперед.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
такую стату можно за один проход по таблице собрать, если правильно запрос написать.
кеширование вообще не имеет никакого отношения к оптимизации запросов.
Ответ написан
Kianl
@Kianl Автор вопроса
Печальный веб-разработчик
Короче. Проблему решил так.

- Услышал про индексы, пошел разбираться.
- Наткнулся на длинную серьезную статью по этой теме: https://ruhighload.com/%D0%98%D0%BD%D0%B4%D0%B5%D0...
- Изучил от и до; приписка в конце положила под стол.
- Как опытный, крайне смекалистый программист-любитель я практически моментально и до последнего слова все не понял, поэтому от нудной теории перешел сразу к веселой практике.
- Начал тестить; в процессе научился работать с БД через консоль.
- Как оказалось, волшебная таблетка - создание индекса на поле ID для таблицы просмотров.

$sql = 'CREATE INDEX id ON wp_post_views(ID)';
$wpdb->get_results($sql);


* здесь ID - это ID поста, к которому относится просмотр, а не primary key, как может показаться

Заткнул я это на хук смены темы (надеюсь я правильно понял, что этот индекс не нужно обновлять вручную?). Залил патч на сервер и, - о чудо! - реально все летает. Там, где раньше грузилось за 10-15 сек стало грузить за 0.5-1.

Mission Complete.

P.S. Всем спасибо, кто помогал. Но впредь сильно не матюкайтесь.. Не все такие крутые гуру, как вы. Некоторые учатся в процессе. Отсюда и шишки.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы