[ОТВЕТИТЬ]
Опции темы
18.10.2016 09:44  
OlegON
В MySQL и MariaDB есть Query Cache или, если по-русски, кеш запросов. Очень значимая и полезная для сохранения ресурсов сервера вещь. Для понимания этой значимости, могу привести пример этого сервера, где выключение query cache привело к возрастанию нагрузки на процессор почти втрое.

Итак, как настраивать Query Cache:
Код:
cat /etc/mysql/my.cnf | grep query_c | sort
query_cache_limit = 256K
query_cache_min_res_unit = 512
query_cache_size = 32M
query_cache_type = ON
для того, чтобы включить кеширование, необходимо query_cache_type выставить в ON или DEMAND, после чего задать query_cache_size отличным от нуля. Обратите внимание, что размер кеша более 256Мб создает трудности процессору по управления таким большим массивом и поиску в нем. Необходимо соблюсти определенный баланс между тем, чтобы кеш был не слишком велик и тем, чтобы его хватало.

Для того, чтобы "лишние" запросы, которые повторяются редко, не попадали в кеш и не замусоривали его, их необходимо сопроводить подсказкой SQL_NO_CACHE. Например
SQL код:
select SQL_NO_CACHE column from table
Для того, чтобы в режиме DEMAND принудительно запихивать запрос в кеш, необходимо использовать подсказку SQL_CACHE.

Чтобы ограничить размер попадающих в кеш результатов, задайте параметры query_cache_limit и query_cache_min_res_unit, первый обозначает максимальный размер выдаваемой под один результат запроса памяти, второй - минимальный размер под возвращаемый результат. Тут все, опять же, зависит от использования СУБД, у меня, например, гора маленьких результатов, а больших не бывает никогда. Поскольку выделение памяти всегда сказывается на общем времени операции, я предпочел маленький минимальный порог и маленький верхний.
 
18.10.2016 09:50  
OlegON
Как анализировать состояние кеша (два запроса с интервалом в секунду)
Код:
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 1038   |
| Qcache_free_memory      | 842568 |
| Qcache_hits             | 63364  |
| Qcache_inserts          | 79822  |
| Qcache_lowmem_prunes    | 10256  |
| Qcache_not_cached       | 3116   |
| Qcache_queries_in_cache | 5359   |
| Qcache_total_blocks     | 21116  |
+-------------------------+--------+
8 rows in set (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 1026   |
| Qcache_free_memory      | 806976 |
| Qcache_hits             | 63505  |
| Qcache_inserts          | 79971  |
| Qcache_lowmem_prunes    | 10256  |
| Qcache_not_cached       | 3116   |
| Qcache_queries_in_cache | 5381   |
| Qcache_total_blocks     | 21149  |
+-------------------------+--------+
необходимо стремиться к тому, чтобы Qcache_free_blocks было ближе к нулю, как и свободная память в кеше. Скорее всего, это вам не удастся, поскольку фрагментация кеша будет этому мешать. Для борьбы можно предложить только уменьшить минимальный размер блока и не помещать в кеш выпадающие из него запросы.

Как видим на примере, кеш заполняется, выпадания запросов по нехватке памяти нет, количество хитов достаточно высокое по отношению к количеству выкинутых запросов, все достаточно сбалансировано.
 
 
Опции темы



Часовой пояс GMT +3, время: 12:52.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.