Кэширование запросов MySQL применяется довольно часто и может быть эффективно, использование кэша позволяет существенно увеличить скорость обработки запросов и оптимизировать работу приложения.
В MySQL внутренними параметрами кэширования являются QuickCache или QCache и определяется приближенно как отношение обращений к кэшу к количеству запросов типа INSERT.
Кэширование запросов MySQL и значения параметров
Существует и более полная формула:
qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)
Можно посмотреть актуальные значения, которые необходимы для расчета выполнив запрос SHOW STATUS LIKE 'Qcache%'; в консоли сервера баз данных
Авторизуемся в консоли MySQL
mysql -u root -p
Выбираем все статусы для Qcache
mysql> SHOW STATUS LIKE 'Qcache%';
+————————-+———+
| Variable_name | Value |
+————————-+———+
| Qcache_free_blocks | 1336 |
| Qcache_free_memory | 5310448 |
| Qcache_hits | 1348276 |
| Qcache_inserts | 181035 |
| Qcache_lowmem_prunes | 24259 |
| Qcache_not_cached | 62095 |
| Qcache_queries_in_cache | 3180 |
| Qcache_total_blocks | 7783 |
+————————-+———+
8 rows in set (0.00 sec)
Результат деления превышающий 0.8, является хорошим. Он означает, что 80% всех запросов, обрабатываемых сером баз данных кэшируются.
Чтобы увеличить процент нужно изменить значения параметров, фигурирующих в формуле, чаще всего меняют query_cache_size. Значение можно изменить в файле /etc/mysql/my.cnf
Текущее значение переменной выводится в консоль следующим образом:
mysql> SHOW VARIABLES LIKE 'query_cache_size';
+——————+———-+
| Variable_name | Value |
+——————+———-+
| query_cache_size | 16777216 |
+——————+———-+
1 row in set (0.00 sec)
Как выбрать значение query_cache_size
Часто значение выбирается интуитивно. Более правильным является вычисление значения по формуле
query_cache_size = (объем трафика за 10 минут) * 1,2
Вернемся к выводу запроса SHOW STATUS LIKE 'Qcache%';
Сейчас нас будут интересовать значения
| Qcache_free_blocks | 1337 |
| Qcache_free_memory | 5268560 |
| Qcache_queries_in_cache | 3183 |
| Qcache_total_blocks | 7793 |
Закэширован 3183 запрос, на каждый из них расходуется 2 блока (один из блоков используется для запроса. второй для результата). Т.е. 6366 блоков всего.
1337 блоков свободно — большое их количество означает большую степень фрагментации кэша, что является плохим показателем. Цель оптимизации данных значений, относящихся к кэшу MySQL в уменьшении Qcache_free_blocks до минимума.
Ошибки при настройке кэширования могут повлечь кэширование данных которые кэшироваться не должны.
Как сбросить кэш MySQL
Здесь могут оказаться полезны следующие команды:
RESET QUERY CACHE;
Для очистки кэша
FLUSH QUERY CACHE;
Для дефрагментации кэша
Читайте также про оптимизацию работы MySQL при высоких нагрузках