Пропустить навигацию.

Кеширование запросов mysql, конфиг my.cnf, права доступа

  • user warning: Got error 28 from storage engine query: SELECT t.tid, t.* FROM term_data t INNER JOIN term_hierarchy h ON h.parent = t.tid WHERE h.tid = 35 ORDER BY weight, name in /var/www/multi/data/multi/modules/taxonomy/taxonomy.module on line 781.
  • user warning: Got error 28 from storage engine query: SELECT t.*,v.weight AS v_weight_unused FROM term_node r INNER JOIN term_data t ON r.tid = t.tid INNER JOIN vocabulary v ON t.vid = v.vid WHERE r.vid = 22 ORDER BY v.weight, t.weight, t.name in /var/www/multi/data/multi/modules/taxonomy/taxonomy.module on line 640.

Описание проблемы

Столкнулся с такой проблемой, что не работает кэширование mysql запросов.

В файле настроек /etc/my.cnf:
query_cache_size = 128M

Перезапускаю mysql, рефрешу страницу сайта, смотрю
mysql -uroot -ppassword
mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';

и вижу одни нули. Значит кэш запросов mysql не работает.

Выполняю в mysql:
set @@global.query_cache_size=64*1024*1024;

Рефрешу страницу сайта и вижу что цифры поползли и кэш работает. В частности один тяжёлый запрос выполняется не 0.5 секунды, а 0.001 секунды.

Решение проблемы

А проблема оказалось в простом, права доступа на my.cnf были 777.

После установки 444 кеширование mysql заработало корректно.

Контекст

К стандартному конфигу /etc/my.cnf было добавлено три строки:
query_cache_limit= 6M # максимальный размер ответа запроса, который кэшируется
query_cache_size = 128M # максимальный размер кеша
query_cache_type=1 # 1 = on, кэш включен

Не забывайте что кэш mysql храниться в оперативной памяти, по этому подбирайте оптимальное значение query_cache_size исходя из своей ситуации. Я рекомендую ставить значение равное 20-30% от реального размера оперативной памяти на вашем сервере/VDS.