Кеширование запросов MySQL: ограничено максимальным размером кеша 128 МБ? - PullRequest
29 голосов
/ 19 января 2010

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

В настоящее время я настраиваю кеш запросов MySQL, чтобы получитьэто соответствует характеристикам запросов, выполняемых на сервере.

query_cache_size - это максимальный объем данных, который может храниться в кэше, а query_cache_limit - это максимальный размер отдельного набора результатов вкеш.

Мой текущий кэш запросов MySQL настроен следующим образом:

query_cache_size=128M
query_cache_limit=1M

tuning-primer.sh дает мне следующие советы по настройке работающей системы:

QUERY CACHE
Query cache is enabled
Current query_cache_size = 128 M
Current query_cache_used = 127 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 99.95 %
Current query_cache_min_res_unit = 4 K
However, 21278 queries have been removed from the query cache due to lack of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in size

И mysqltuner.pl дает следующие советы по настройке:

[OK] Query cache efficiency: 31.3% (39K cached / 125K selects)
[!!] Query cache prunes per day: 2300654

Variables to adjust:
    query_cache_size (> 128M)

Оба сценария настройки предлагают, чтобы я поднял query_cache_size.Однако увеличение query_cache size над 128M может снизить производительность в соответствии с mysqltuner.pl (см. http://mysqltuner.pl/).

Как бы вы решили эту проблему? Вы бы увеличили query_cache_size несмотря на предупреждение mysqltuner.pl или попытались быкаким-то образом настроить логику запросов? Большая часть доступа к данным обрабатывается Hibernate, но в приложении также используется довольно много кода SQL, написанного вручную.

Ответы [ 6 ]

18 голосов
/ 28 ноября 2011

Предупреждение, выданное mysqltuner.py, действительно уместно, даже если ваш кэш не имеет риска замены. Это хорошо объяснено в следующем: http://blogs.oracle.com/dlutz/entry/mysql_query_cache_sizing

В основном MySQL тратит больше времени на очистку кеша, чем больше кеш, и поскольку кеш очень изменчив при даже умеренных нагрузках записи (запросы часто очищаются), слишком большой размер может отрицательно повлиять на производительность приложения. Настройте query_cache_size и query_cache_limit для своего приложения, попробуйте найти точку разрыва, где у вас больше всего попаданий на одну вставку, небольшое число lowmem_prunes и при этом внимательно следите за нагрузкой на серверы баз данных.

14 голосов
/ 27 марта 2013

Вы должны легко увеличивать кэш, это не просто "не так много доступной памяти"!

Чтение, например, руководство Вы получите эту цитату:

Будьте осторожны с чрезмерно большим размером кеша запросов, что увеличивает накладные расходы, необходимые для обслуживания кеша, возможно, помимо выгоды от его включения. Размеры в десятки мегабайт обычно выгодны. Размеры в сотнях мегабайт могут не быть.

Есть различные другие источники , которые вы можете проверить!

Ненулевая скорость сокращения может указывать на то, что вам следует увеличить размер кэша запросов. Однако имейте в виду, что накладные расходы на обслуживание кэша, вероятно, будут увеличиваться с его размером, поэтому делайте это небольшими шагами и следите за результатом. Если вам необходимо значительно увеличить размер кеша для удаления чернослива, есть большая вероятность того, что ваша рабочая нагрузка не соответствует кешу запросов.

Так что не кладите столько, сколько можете, в этот кеш запросов!

Лучше всего будет постепенно увеличивать кэш запросов и измерять производительность на вашем сайте. Это своего рода задание по умолчанию в вопросах производительности, но в подобных случаях «тестирование» - одна из лучших вещей, которые вы можете сделать.

13 голосов
/ 19 января 2010

Обычно предупреждения «слишком большой размер кэша» выдаются в предположении, что у вас мало физической памяти, и сам кэш необходимо заменить или использовать ресурсы, необходимые для OS (например, файловый кэш).

Если у вас достаточно памяти, можно увеличить query_cache size (я видел установки с 1GB кешем запросов).

Но вы уверены, что используете кеш запросов, верно? У вас есть много дословно повторяющихся запросов? Не могли бы вы опубликовать пример типичного запроса?

4 голосов
/ 12 февраля 2016

Будьте осторожны с установкой query_cache_size и ограничением высокого уровня. MySQL использует только один поток для чтения из кэша запросов.

При query_cache_size , установленном на 4G и query_cache_limit 12M, мы имели частоту кеширования запросов 85%, но заметили повторяющиеся пики в соединениях.

После изменения query_cache_size на 256M с 64K query_cache_limit коэффициент кэширования запросов снизился до 50%, но общая производительность увеличилась.

4 голосов
/ 21 апреля 2013

Накладные расходы для кэша запросов составляют около 10%, поэтому я бы отключил кэширование запросов. Обычно, если вы не можете получить показатель успешности выше 40 или 50%, возможно, кеш запросов не подходит для вашей базы данных.

У меня есть блог на эту тему ... Производительность Mysql query_cache_size здесь .

3 голосов
/ 16 июля 2013

Query Cache становится недействительным / сбрасывается каждый раз, когда происходит вставка, используйте InnoDB / cache и избегайте кеша запросов или установите для него очень маленькое значение.

...