Как лучше кешировать, в файле или в базе

180
04 августа 2017, 02:02

Как лучше кешировать данные?..

Есть сложный запрос, с несколькими LEFT JOIN, подзапросом, GROUP BY и LIMIT.

Есть в базе 1000записей, в одном запросе выводится 50 записей с учетом LIMIT 50, 0;

Сначала - я кэшировал все данные в файл (чем больше стало данных, тем дольше чтение файла) - и это меня отвергло от кэша в файл.

Но как тогда кэшировать данные, чтобы не грузить базу запросами? Эти 1000строк результата, записывать может в базу в колонку cache, и оттуда тянуть данные? Но это же опять будет бред...

Подскажите, пожалуйста

Боюсь за нагрузку бд, ибо если сидит 100человек на сайте - это уже 100запросов к базе...

Почитал, что файловый кэш использовать только при малых объемах данных, получается необходимо использовать запросы к базе, но это же большая нагрузка на бд будет, и кэширование запросов не поможет, так как банально даже LIMIT записей будет разный.

Как в таком случае лучше кэшировать?

Answer 1

Если у вас проблемы с производительностью на тысяче записей и ста пользователях, то вы явно что-то делаете не так и нужно разбираться - что именно.

Реальные сайты работают на базах с сотнями тысяч и больше записей. Для показа одной страницы могут отправляться десятки запросов, которые могут возвращать многие тысячи строк - и всё это для десятков тысяч пользователей. Если на ваших масштабах у вас уже проблема с производительностью, то есть какая-то фундаментальная проблема, которую нужно найти.

Возможно, запрос сильно не оптимален. Попробуйте задать отдельный вопрос в котором приведите код запроса с просьбой помочь оптимизировать (в вопросе также нужно будет привести структуру вашей базы, количество строк в каждой таблице и сколько по времени сейчас занимает выполнение запроса.)

Возможно, вам просто нужно добавить индексы чтобы ускорить его выполнение.

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

Answer 2

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

Если же у вас на сервере мало памяти, то тут мало какие оптимизации помогут. Подумайте, может +$10 в месяц на более мощный сервер принципиально решат вашу проблему?

Стоит кешировать не столько результаты запроса, а сколько готовый результат. Например, если в результате у вас на какой-то странице показывается кусок HTML, то именного его и нужно кешировать в файле или ещё где. Этим вы получите максимальную выгоду от кеша так как исключается необходимость парсинга. Прочитали файл, отдали клиенту, всё!

Где кешировать - вопрос удобства. Если у вас только один запрос, то и в файле удобно. Если у вас тысячи разных запросов, то memcached/redis справятся с задачей с меньшим приложением усилий с вашей стороны.

Answer 3

Парсить файл в любом случае дольше чем идет запрос до БД, имхо. А если БД на одном сервере с сайтом, то вообще отлично.

READ ALSO
Загрузка через xml доп полей в wordpress

Загрузка через xml доп полей в wordpress

Есть произвольные типы записей, назовем их Объекты сделал загрузку xml в формате яндекс, но почему то могу только стандартные поля добавить,...

251
Вставить данные в mysql через php

Вставить данные в mysql через php

ЗдравствуйтеЕсть список, выводящийся на странице, с текстовым полем для изменения

266
Как добавить meta-тег при пагинации в MODX Revo

Как добавить meta-тег при пагинации в MODX Revo

Подскажите, как добавить <meta name="robots" content="noindex,follow" />при пагинации от 2 и вышеТакое окончание ?page=3 Сайт на MODX Revo

274