2016-02-14 4 views
0

У меня есть этот запрос, который возвращает топ-10 продаваемых продуктов, а также используется на главной странице:Кэш запросов MySQL для дорогих запросов?

SELECT a.id, a.title, SUM(b.sold) as 'sold' FROM products a 
LEFT JOIN stock b ON b.product_id = a.id 
GROUP BY a.id ORDER BY sold DESC LIMIT 10 

Эта информация не должна быть актуальной - это нужно только обновить, возможно, один раз в день. Таким образом, у меня было два вопроса:

1) Учитывая, что это оценивает проданный СУММ каждого отдельного продукта (из таблицы запасов, где каждый продукт имеет несколько строк), является ли это вычислительно дорогостоящим запросом - точнее, . be, если это была большая база данных?

2) Может ли MySQL кэшировать этот запрос и обновлять его только один раз в день? Я знаю, что он имеет кэш запросов, который он использует по умолчанию, но согласно этому этот запрос будет признан недействительным каждый раз при изменении количества проданных предметов.

Я просто ищу способы быть более эффективными, если быть честным.

+0

Что касается использования [Планировщика событий MySQL] (https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html) для обновления статической таблицы с результатами дорогого запроса, по расписанию? –

ответ

1

Что бы я сделал, это кэшировать его в коде, который запрашивает базу данных. Сохраняйте отметку времени в последний раз, когда вы запрашивали, и если отметка времени достаточно недавняя, верните результат в кеш, вместо того, чтобы запускать запрос. Вы также можете использовать систему кэширования, такую ​​как memcached или Redis ... и как только вы настроите эту настройку, вы, вероятно, найдете сто других мест, которые вы можете использовать!

Или, если на вашей домашней странице нет другого контента, который является динамическим, вы можете преобразовать свою домашнюю страницу в статический HTML-файл, который вы создаете один раз в день. Простой & быстрый.

+0

Отличный совет - спасибо большое. – daninthemix

1

1) Это так же дорого, как и ряды на складе.

2) Нет, mysql не имеет ничего подобного. Чтобы кэшировать один запрос, вы должны использовать кеш приложения. Это довольно распространенное требование, и, как вы это делаете, это зависит от вашего приложения и его архитектуры, конечно.

+0

Прохладный, спасибо за ваш вклад. – daninthemix