Cache de consulta MySQL: limitado a um tamanho máximo de cache de 128 MB?

a minha aplicação é muito intensiva em bases de dados, por isso tentei muito para garantir que a aplicação e a base de dados MySQL estão a funcionar o mais eficientemente possível em conjunto.

actualmente estou a sintonizar a cache de consultas MySQL para a pôr em linha com as características das consultas que estão a ser executadas no servidor.

query_cache_size é a quantidade máxima de dados que podem ser armazenados no cache e query_cache_limit é o tamanho máximo de um único resultado no cache.

a minha actual MySQL a 'cache' da pesquisa é configurada do seguinte modo:

query_cache_size=128M
query_cache_limit=1M

tuning-primer.sh dá-me as seguintes dicas de afinação sobre o sistema em execução:

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

e mysqltuner.pl dá as seguintes dicas de afinação:

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

Variables to adjust:
    query_cache_size (> 128M)

ambos os scripts de afinação sugerem que eu deveria aumentar o query_cache_size. No entanto, aumentar o query_cache size mais de 128 M pode reduzir o desempenho de acordo com mysqltuner.pl (ver http://mysqltuner.pl/).

Como resolveria este problema? Aumentaria o tamanho do query_cache_size apesar de mysqltuner.pl avisar ou tentar ajustar a lógica questionadora de alguma forma? A maioria dos dados de acesso é manuseada pelo Hibernate, mas um monte de SQL manualmente é usado na aplicação também.

Author: KęstutisV, 2010-01-19

6 answers

Normalmente os avisos de "tamanho de cache demasiado grande" são emitidos sob a suposição de que você tem pouca memória física e a própria cache precisa muito bem de ser trocada ou irá tomar recursos que são necessários para o OS (como a cache de arquivos).

Se você tem memória suficiente, é Seguro aumentar {[[1]} (Eu vi instalações com 1GB cache de consulta).

Mas tens a certeza que estás a usar bem a cache da consulta? Há muitas perguntas que se repetem textualmente? Pode, por favor, publicar o exemplo de uma consulta típica?

 12
Author: Quassnoi, 2010-01-19 17:53:13

A advertência emitida por mysqltuner.py é realmente relevante, mesmo se o seu cache não tem risco de ser trocado. É bem explicado no seguinte: http://blogs.oracle.com/dlutz/entry/mysql_query_cache_sizing

Basicamente o MySQL passa mais tempo a preparar o cache, quanto maior o cache é e como o cache é muito volátil sob cargas de escrita moderadas (as consultas são removidas frequentemente), colocá-lo demasiado grande terá um efeito adverso no desempenho da sua aplicação. Ajustar o {[[0]} e query_cache_limit para a sua aplicação, tente encontrar um ponto de ruptura onde tenha a maior parte de acessos por inserção, um número baixo de lowmem_prunes e mantenha um olho atento nos servidores de bases de dados que carregam enquanto o fazem também.

 17
Author: mikn, 2015-08-24 08:37:15

Você deve ser fácil em aumentar o seu cache, não é apenas uma coisa "não muito disponível mem"!

Lendo por exemplo o manual obtém-se esta citação:

Seja cauteloso sobre dimensionar o cache de consulta excessivamente grande, o que aumenta a sobrecarga necessária para manter o cache, possivelmente além do benefício de habilitá-lo. Tamanhos em dezenas de megabytes são geralmente benéficos. Tamanhos em centenas de megabytes podem não ser.

Existem várias outras fontes que podes verificar!

Uma taxa de ameixa não-zero pode ser uma indicação de que você deve aumentar o tamanho do seu cache de consulta. No entanto, tenha em mente que a sobrecarga de manutenção do cache é provável que aumente com o seu tamanho, então faça isso em pequenos incrementos e monitore o resultado. Se você precisa aumentar dramaticamente o tamanho do cache para eliminar ameixas, há uma boa chance de que sua carga de trabalho não é uma boa correspondência para o cache da consulta.

Por isso não ponhas o máximo que puderes nesse cache de consultas!

A melhor coisa, seria aumentar gradualmente o cache da consulta e medir o desempenho em seu site. É algum tipo de padrão em questões de desempenho, mas em casos como este 'teste' é uma das melhores coisas que você pode fazer.

 12
Author: Nanne, 2013-03-27 17:36:59

Tenha cuidado com a configuração do query_cache_size e limite para alto. O MySQL só usa um único tópico para ler a partir do cache da consulta.

Com o query_cache_size definido em 4G e query_cache_limit 12M tínhamos uma taxa de cache de consultas de 85%, mas notámos um pico recorrente nas ligações.

Depois de mudar o query_cache_size para 256M com 64K query_cache_limit a razão da cache da consulta caiu para 50%, mas o desempenho global aumento.

 4
Author: Brian van Rooijen, 2016-02-12 15:08:00

A Cache da consulta fica inválida / removida sempre que há uma inserção, utilize a InnoDB/cache e evite a cache da consulta ou configure-a com um valor muito pequeno.

 3
Author: PePe, 2013-07-16 05:32:11

A sobrecarga para a 'cache' da pesquisa é de cerca de 10%, por isso eu iria desactivar a 'cache' da pesquisa. Normalmente, se você não pode obter a sua taxa de sucesso acima de 40 ou 50% talvez cache de consulta não é certo para a sua base de dados.

Tenho um blog sobre este tema... MySQL query_cache_size performance here .
 3
Author: Hayden, 2014-07-10 21:44:29