Кеширование запросов в MySQL - PullRequest
3 голосов
/ 17 ноября 2009

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

например. Это простой запрос, который возвращает 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 (т. Е. Третья «страница» результатов). Когда пользователь затем выбирает «следующую» страницу, он будет использовать OFFSET 40 вместо 30.

Моя проблема в том, что ничего не кэшируется, хотя пара LIMIT / OFFSET используется в одном и том же наборе данных, она выполняет SUM () снова, просто чтобы сместить результаты еще на 10.

Приведенный выше пример является упрощенной версией гораздо большего запроса, который просто возвращает больше полей и занимает очень много времени (20+ секунд и будет увеличиваться по мере роста системы).

Поэтому я, по сути, ищу решение для ускорения загрузки страницы путем кэширования состояния до применения LIMIT / OFFSET.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2009

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

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

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

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

1 голос
/ 17 ноября 2009

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

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

0 голосов
/ 17 ноября 2009

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

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

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

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