У меня много проблем с кешем запросов в проекте: я использую Percona-вкус MySQL, такие же версии как на моей локальной машине разработки, так и на рабочем сервере. Теперь включение кеша запросов дает мне отличные результаты на моей локальной машине: практически все запросы, которые нужно кэшировать, эффективно.
Теперь точно такие же запросы не кэшируются на рабочем сервере. Все точно так же; переменные mysql, содержимое базы данных, кодовая база, зарегистрированный пользователь, но при производстве кэшируются только несколько запросов, причем самые важные из них пропускаются. И я не могу понять, почему: -)
Итак, ища решение, я работаю со следующим запросом, используемым для выбора последних 3 тем из таблицы тем: (это самый "тяжелый" запрос и тот, который я определенно хочу кэшировать! )
SELECT `topic`.* FROM `topics` AS `topic`
LEFT OUTER JOIN `topics` AS `topic_helper`
ON (`topic`.`id` = `topic_helper`.`id`
AND `topic_helper`.`created_on` < `topic`.`created_on`)
GROUP BY `topic`.`id` HAVING COUNT(*) < 3
ORDER BY `topic`.`created_on` DESC;
Итак, для начала SHOW VARIABLES LIKE '%query_cache%
дают мне те же результаты, что и локальные, как и при производстве:
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 10485760 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
Выполнение вышеуказанного запроса будет кэшироваться локально после первого запуска, так как SHOW PROFILE
ясно сообщает мне ближе к концу трассировки:
| Waiting for query cache lock | 0.000001 |
| Waiting on query cache mutex | 0.000001 |
| freeing items | 0.000000 |
| storing result in query cache | 0.000002 |
| logging slow query | 0.000001 |
| cleaning up | 0.000006 |
+--------------------------------+----------+
Второй вызов возвращает запрос из кэша, как и ожидалось.
На рабочем сервере запуск этого запроса никогда не будет храниться в кеше. Результирующий набор точно такой же, и явно не используются никакие операторы, которые могут привести к аннулированию кеширования запросов (согласно руководству в http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html - Я уверен, что указанный выше запрос соответствует требованиям для его кэширования.)
Для полноты полноты полный вывод SHOW PROFILE
для того же запроса на производственном сервере вставляется здесь: http://pastebin.com/7Jm5rmVd
Кроме того, стоит отметить, что, хотя конфигурация на обоих серверах абсолютно одинакова, моя локальная версия - 5.5.27, немного более новая, чем та, что была в версии 5.5.17-55. Может быть, это проблема..?
Я сравнил полный вывод SHOW VARIABLES;
с моего локального сервера как с производственным сервером, чтобы увидеть, не пропало ли что-либо, но ничего не отличается, кроме системного часового пояса и пути к файлам журналов и т.д.
Итак, может кто-нибудь из вас знает, где искать дальше? Или можете понять, что может быть причиной этого?