Я создаю довольно большую систему статистики, которая должна позволить пользователям запрашивать статистику для заданного набора фильтров (например, диапазон дат).
Например, это простой запрос, который возвращает 10 результатов, включая player_id и количество убийств, которые сделал каждый игрок:
SELECT player_id, SUM(kills) as kills FROM `player_cache` GROUP BY player_id ORDER BY kills DESC LIMIT 10 OFFSET 30
Вышеуказанный запрос компенсирует результаты на 30 (т. Е. 3-я страница) результатов. Когда пользователь затем выбирает страницу «next», он будет использовать OFFSET 40 вместо 30.
Моя проблема заключается в том, что ничего не кэшируется, даже если пара LIMIT / OFFSET используется в одном наборе данных, она снова выполняет SUM (), чтобы компенсировать результаты еще на 10.
Вышеприведенный пример представляет собой упрощенную версию гораздо большего запроса, который просто возвращает больше полей и занимает очень много времени (20 + секунд, и будет только увеличиваться по мере роста системы).
Поэтому я в основном ищу решение для ускорения загрузки страницы, путем кэширования состояния до применения LIMIT / OFFSET.
Конечно, вы можете использовать кеширование, но я бы рекомендовал кэшировать результат, а не запрос в mysql.
Но сначала сначала убедитесь, что a) у вас есть правильная индексация ваших данных, b) что она используется .
Если это не работает, поскольку группа, как правило, медленна с большими наборами данных, вам необходимо поместить сводные данные в статическую таблицу / файл / базу данных.
Существует несколько методов / библиотек и т. Д., Которые помогают выполнять кеширование ваших данных на стороне сервера. Кэширование PHP для ускорения динамически генерируемых сайтов предлагает довольно простой, но объяснительный пример этого.
Рассматривали ли вы периодический длительный запрос и сохраняли все результаты в сводной таблице? Сводная таблица может быть быстро запрошена, потому что нет JOIN и GROUPING. Недостатком является то, что сводная таблица не соответствует текущему потоку.
Я понимаю, что это не относится к проблеме LIMIT / OFFSET, но она устраняет проблему с запуском сложного запроса несколько раз.
В зависимости от того, как часто обновляются данные, хранилище данных является прямым решением для этого. В основном вы:
Существуют различные методы оптимизации, которые вы можете использовать, но стоит обратить внимание: