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/).
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.
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?
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.
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!
Por isso não ponhas o máximo que puderes nesse cache de consultas!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.
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.
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.
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.
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 .