8.10.3.3 Настройка кэша запросов
Кэш запросов устарел начиная с MySQL 5.7.20 и удален в MySQL 8.0.
Переменная серверной системы have_query_cache указывает, доступен ли кэш запросов:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
При использовании стандартной двоичной версии MySQL это значение всегда YES, даже если кэширование запросов отключено.
Несколько других переменных системы управляют работой кэша запросов. Их можно задать в файле параметров или в командной строке при запуске mysqld. Все переменные системы кэша запросов начинаются с query_cache_. Они кратко описаны в разделе 5.1.7 «Переменные системы сервера», а дополнительные сведения о конфигурации приведены здесь.
Для установки размера кэша запросов задайте переменную системы query_cache_size. Установка значения 0 отключает кэш запросов, как и установка query_cache_type=0. По умолчанию кэш запросов отключен. Это достигается с помощью значения по умолчанию 1 МБ, а по умолчанию query_cache_type равно 0.
Для значительного уменьшения накладных расходов запустите сервер с query_cache_type=0, если вы не планируете использовать кэш запросов.
При использовании мастера конфигурации Windows для установки или настройки MySQL значение по умолчанию для query_cache_size настраивается автоматически в зависимости от доступных типов конфигурации. При использовании мастера конфигурации Windows кэш запросов может быть включен (то есть установлен на ненулевое значение) из-за выбранной конфигурации. Кэш запросов также контролируется значением переменной query_cache_type. Проверьте значения этих переменных в вашем файле my.ini после завершения настройки.
При установке query_cache_size на ненулевое значение следует учитывать, что для выделения своих структур кэшу запросов необходим минимальный размер примерно 40 КБ. (Точный размер зависит от архитектуры системы). Если вы установите слишком маленькое значение, вы получите предупреждение, как в этом примере:
mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1282
Message: Query cache failed to set size 39936;
new query cache size is 0
mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+
Для того, чтобы кэш запросов действительно мог хранить результаты запросов, его размер должен быть больше:
mysql> SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| query_cache_size | 999424 |
+------------------+--------+
1 row in set (0.00 sec)
Значение query_cache_size выравнивается к ближайшему блоку размером 1024 байта. Таким образом, сообщаемое значение может отличаться от значения, которое вы присвоили.
Если размер кэша запросов больше 0, переменная query_cache_type влияет на его работу. Эта переменная может принимать следующие значения:
Значение
0илиOFFпредотвращает кэширование или извлечение результатов из кэша.Значение
1илиONвключает кэширование, за исключением тех операторов, которые начинаются сSELECT SQL_NO_CACHE.Значение
2илиDEMANDприводит к кэшированию только тех операторов, которые начинаются сSELECT SQL_CACHE.
Если query_cache_size равно 0, вы также должны установить переменную query_cache_type в 0. В этом случае сервер вообще не приобретает мьютекс кэша запросов, что означает, что кэш запросов нельзя включить во время выполнения, и при выполнении запросов уменьшается нагрузка.
Установка значения GLOBAL query_cache_type определяет поведение кэша запросов для всех клиентов, подключенных после внесения изменения. Отдельные клиенты могут управлять поведением кэша для собственного подключения, установив значение SESSION query_cache_type. Например, клиент может отключить использование кэша запросов для собственных запросов следующим образом:
mysql> SET SESSION query_cache_type = OFF;
Если вы установили query_cache_type при запуске сервера (а не во время выполнения с помощью оператора SET), допускаются только числовые значения.
Для управления максимальным размером отдельных результатов запросов, которые могут быть кэшированы, установите переменную системы query_cache_limit. Значение по умолчанию равно 1 МБ.
Следите за тем, чтобы не устанавливать слишком большой размер кэша. Из-за необходимости блокировки кэша потоками во время обновлений вы можете столкнуться с проблемами блокировки при очень большом кэше.
Максимальный размер, который может быть указан для кэша запросов во время выполнения, можно установить с помощью оператора SET, используя параметр --maximum-query_cache_size= в командной строке или в файле конфигурации. 32M
Когда запрос должен быть помещен в кэш, его результат (данные, отправленные клиенту) сохраняется в кэше запросов во время извлечения результата. Поэтому данные обычно не обрабатываются в одном большом блоке. Кэш запросов выделяет блоки для хранения этих данных по мере необходимости, поэтому при заполнении одного блока выделяется новый блок. Поскольку операция выделения памяти является дорогостоящей (по времени), кэш запросов выделяет блоки с минимальным размером, заданным переменной системы query_cache_min_res_unit. При выполнении запроса последний блок результата обрезается до фактического размера данных, чтобы освободить неиспользуемую память. В зависимости от типов запросов, выполняемых вашим сервером, может быть полезно настроить значение query_cache_min_res_unit:
Значение по умолчанию для
query_cache_min_res_unitравно 4 КБ. Это должно быть достаточно для большинства случаев.Если у вас много запросов с небольшими результатами, размер блока по умолчанию может привести к фрагментации памяти, как указано большим количеством свободных блоков. Фрагментация может заставить кэш запросов удалять (удалять) запросы из кэша из-за нехватки памяти. В этом случае уменьшите значение
query_cache_min_res_unit. Количество свободных блоков и запросов, удаленных из-за обрезки, задаются значениями переменных состоянияQcache_free_blocksиQcache_lowmem_prunes.Если большинство ваших запросов имеют большие результаты (проверьте переменные состояния
Qcache_total_blocksиQcache_queries_in_cache), вы можете повысить производительность, увеличивquery_cache_min_res_unit. Однако будьте осторожны, чтобы не сделать его слишком большим (см. предыдущий пункт).
© 2025 Oracle
Licensed under the GPLv2 License.