Среди прочих данных tuning-primer сообщает что:
QUERY CACHE
Query cache is supported but not enabled
Perhaps you should set the query_cache_size
query_cache
– это область памяти, выделяемая MySQL при старте, в которой хранятся запросы и их результаты типа SELECT
. При получении нового запроса SELECT
– MySQL сначала проверяет нет ли такого же запроса в этом кеше и, если есть, возвращает значение из памяти, иначе – выполняет обращение к базе (и диску). Обратите внимание, что select * FROM
и SELECT * FROM
для кеша MySQL являются двумя различными запросами.
Кеш запросов поддерживается в MySQL версий > 4.0:
MariaDB [(none)]> SHOW VARIABLES LIKE 'have_query_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+
По умолчанию query_cache
отключён, что можно проверить так:
MariaDB [(none)]> SHOW VARIABLES LIKE 'query_cache_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_size | 0 | +------------------+-------+
Qcache
может иметь три состояния:
MariaDB [(none)]> SHOW VARIABLES LIKE 'query_cache_type'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_type | ON | +------------------+-------+
0
(OFF
) –Qcache
отключён;1
(ON
) –Qcache
включен;2
(DEMAND
) – только для запросов с явным указанием его кеширования (SELECT SQL_CACHE
).
Что бы включить его – достаточно установить query_cache_size
в любое положительное значение, отличное от нуля.
В настройке Qcache
главную роль играют три параметра:
query_cache_size
– размер памяти, выделяемый под кеш;query_cache_type
– см. выше;query_cache_limit
– максимальный размер возвращаемого результата запроса, который будет хранится в кеше.
Устанавливаем query_cache_size
= 16 МБ, query_cache_type
= 1 а query_cache_limit
– оставляем по умолчанию, 1 МБ:
MariaDB [(none)]> SET GLOBAL query_cache_size=16*1024*1024;
MariaDB [(none)]> SET GLOBAL query_cache_type=1; Query OK, 0 rows affected (0.00 sec)
Проверяем:
MariaDB [(none)]> 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 | 16777216 | | query_cache_strip_comments | OFF | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+
Через какое-то время, хотя бы час, проверяем статус:
MariaDB [(none)]> SHOW STATUS LIKE 'qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 176 | | Qcache_free_memory | 13628632 | | Qcache_hits | 9935 | | Qcache_inserts | 4537 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 2614 | | Qcache_queries_in_cache | 392 | | Qcache_total_blocks | 1069 | +-------------------------+----------+
В последней выборке нас интересуют:
Qcache_free_memory
– доступное место в кеше;Qcache_hits
– количество запросов, отработанных из кэша;Qcache_inserts
– количество добавлений запросов в кэш;Qcache_not_cached
– количество запросов, не подлежащих кэшированию;Qcache_lowmem_prunes
– количество высвобождений памяти из-за наполненности кэша.
Теперь посчитаем % использования кеша:
Qcache_free_memory * 100 / query_cache_size
– дадут нам % свободного места в query_cache_size
:
>>> 13694488.0 * 100 / 16777216.0 81.625509262084961
81.6% свободно.
Или наоборот – % занятого места:
((query_cache_size-Qcache_free_memory)/query_cache_size)*100
>>> ((16777216.0 - 13694488.0) / 16777216.0) * 100 18.374490737915039
Т.е. занято 18.37%. Смысла в увеличении пока нет.
Что бы убедиться в этом – подсчитаем ещё такое значение как “Query Cache Hit Rate” по формуле:
((Qcache_hits/(Qcache_hits+Qcache_inserts+Qcache_not_cached))*100)
Получаем такое значение:
>>> (9935.0 / (9935.0 + 4537.0 + 2614.0)) * 100 58.147020952826878
Т.е. – MySQL обращался к кешу 17086 раз (Qcache_hits+Qcache_inserts+Qcache_not_cached
), и 9935 запросов были выданы из кеша, следовательно Query Cache Hit Rate
= 58%.
Это не самое хорошее значение, однако – пока оно выше 50% – query_cache_size
можно не менять. Если значение менее 50% – можно увеличить размер кеша, а если же значение ниже 10-20% – то, возможно, Qcache
лучше не использовать вообще.
Ещё два важных значения – это соотношение значений Qcache_hits/Qcache_inserts
и Qcache_inserts/Qcache_lowmem_prunes
.
Из примера выше – для Qcache_hits/Qcache_inserts
получаем такое значение:
>>> 11386.0 / 5697.0 1.9985957521502544
Т.е. – в среднем каждый добавленный в кеш результат был выдан клиентам 2 раза. Чем ближе значение к соотношению 1:1 (или даже меньше, напрмиер – 0.5:1) – тем меньше эффективность работы кеша.
Второе значение Qcache_inserts/Qcache_lowmem_prunes
– из примера выше получить не выйдет (т.к. Qcache_lowmem_prunes
= 0), поэтому – возьмём значение с другой базы другого сервера:
mysql> SHOW STATUS LIKE 'qcache%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ ... | Qcache_inserts | 2773956 | | Qcache_lowmem_prunes | 1417292 |
…
Результат:
>>> 2773956.0 / 1417292.0 1.957222647132701
Т.е. – фактически, каждый второй запрос и результат, добавленные в кеш, были удалены.
Можно посчитать процентное соотношение:
>>> 1417292.0 * 100 / 2773956.0 51.092807528309748
Итого – процент удалений кеша равен 51%, тогда как более-менее оптимальным считается значение 10-20% удалений.
Эти же данные можно получить в выводе утилиты mysqlreport
:
$ mysqlreport --user root --password password | less ... __ Query Cache _________________________________________________________ Memory usage 3.48M of 8.00M %Used: 43.46 Block Fragmnt 4.13% Hits 1.35M 0.8/s Inserts 2.96M 1.8/s Insrt:Prune 1.95:1 0.9/s Hit:Insert 0.46:1 ...
По теме:
http://goldapplesoftware.ca