Кэширование запросов в MySQL

Я создаю довольно большую систему статистики, которая должна позволить пользователям запрашивать статистику для заданного набора фильтров (например, диапазон дат).

Например, это простой запрос, который возвращает 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.

Related of "Кэширование запросов в MySQL"

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

Но сначала сначала убедитесь, что a) у вас есть правильная индексация ваших данных, b) что она используется .

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

Существует несколько методов / библиотек и т. Д., Которые помогают выполнять кеширование ваших данных на стороне сервера. Кэширование PHP для ускорения динамически генерируемых сайтов предлагает довольно простой, но объяснительный пример этого.

Рассматривали ли вы периодический длительный запрос и сохраняли все результаты в сводной таблице? Сводная таблица может быть быстро запрошена, потому что нет JOIN и GROUPING. Недостатком является то, что сводная таблица не соответствует текущему потоку.

Я понимаю, что это не относится к проблеме LIMIT / OFFSET, но она устраняет проблему с запуском сложного запроса несколько раз.

В зависимости от того, как часто обновляются данные, хранилище данных является прямым решением для этого. В основном вы:

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

Существуют различные методы оптимизации, которые вы можете использовать, но стоит обратить внимание:

  1. Удаление полей, которые вам не нужно сообщать
  2. Добавление дополнительных индексов к существующим таблицам
  3. Добавление новых таблиц / представлений, которые суммируют данные в форме, в которой вы нуждаетесь.