Кэширование запросов MySQL и query_cache_size


Кэширование запросов MySQL применяется довольно часто и может быть эффективно, использование кэша позволяет существенно увеличить скорость обработки запросов и оптимизировать работу приложения.



В MySQL внутренними параметрами кэширования являются QuickCache или QCache и определяется приближенно как отношение обращений к кэшу к количеству запросов типа INSERT.

Кэширование запросов MySQL


Кэширование запросов 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 при высоких нагрузках

Сказать спасибо