Ajustando (e entendendo) table_cache no mySQL

18

Eu executei o excelente script de ajuste de desempenho do MySQL e comecei a trabalhar com as sugestões. Um que eu encontrei foi

CACHE DE TABELA
Valor atual table_cache = 4096 tabelas Você tem um total de 1073 tabelas. Você tem 3900 mesas abertas. A taxa de acerto atual do table_cache é de 2%, enquanto 95% do cache da tabela está em uso. Você provavelmente deve aumentar seu table_cache

Comecei a ler o table_cache, mas achei a documentação do MySQL bastante inexistente. Eles dizem para aumentar o table_cache", se você tiver a memória". Infelizmente, a table_cachevariável é definida como "O número de tabelas abertas para todos os threads".

Como a memória usada pelo MySQL muda, se eu aumentar essa variável? Qual é um bom valor, para defini-lo?

jotango
fonte

Respostas:

16

Da documentação do MySQL

Por exemplo, para 200 conexões simultâneas em execução, você deve ter um tamanho de cache de tabela de pelo menos 200 × N, em que N é o número máximo de tabelas por junção em qualquer uma das consultas executadas. Você também deve reservar alguns descritores de arquivo extras para tabelas e arquivos temporários.

Portanto, se no seu aplicativo você tiver uma consulta que une 4 tabelas e desejar poder manipular 200 conexões simultâneas, com base nessa instrução, o table_cache deve ter pelo menos 800.

Quanto ao uso da memória, eu não tenho esses números, eu suspeitaria que isso dependerá do tamanho das suas tabelas em cache.

ManiacZX
fonte
Obrigado pelo ponteiro. Estou com um pouco de medo de aumentar meu número table_cache sem saber como o uso da RAM será alterado. A RAM da máquina já está cheia.
jotango
Tem certeza de que a memória está realmente esgotada ou apenas a memória foi ocupada por buffers / cache? Execute "free -m" e observe a segunda linha (- / + buffers / cache), esta é uma representação mais precisa do uso de memória em mb. Veja as respostas em serverfault.com/questions/73189/… e serverfault.com/questions/9442/…
ManiacZX
Sim, está realmente usando a memória. Ontem ele trocou, o que é realmente ruim para um banco de dados de produção. Eu pedi uma atualização de RAM da HP hoje.
jotango
para quem vem agora, esta resposta não é precisa para o mysql 5.1+. agora se refere a table_open_cachequando você olha os documentos. Veja @MarkRs resposta ao olhartable_cache
Jason
3

Você deve monitorar a variável Opened_Tables e ver com que rapidez ela aumenta. Se for significativamente mais rápido do que você criar novas tabelas (incluindo temporárias), o cache da tabela poderá ser muito pequeno.

O Table_Cache deve sempre - bem de qualquer maneira - ser significativamente maior que o número total de tabelas no servidor. Caso contrário, ele continuará abrindo e fechando tabelas.

Não vejo como você pode obter uma taxa de acerto de cache de 2%, a menos que você esteja medindo o tempo logo após a reinicialização do servidor ou usando muito o FLUSH TABLES (em relação ao número de consultas). Normalmente, a taxa de acertos do cache da tabela deve ser de 99,9%, caso contrário, o desempenho será ruim.

Não faça um FLUSH TABLES se você puder evitá-lo, pois ele acaba com o cache.

Abrir tabelas é caro, pois precisa ler o arquivo FRM. No MyISAM, é significativamente pior (do que outros mecanismos), pois quando fecha uma tabela, também lança todos os blocos no cache de chaves provenientes de seus índices. Portanto, fechar uma tabela despeja seus índices do cache de chaves == não é bom! Outros mecanismos mantêm os blocos em cache, mas ainda precisam reler os metadados e alocar algumas estruturas.

MarkR
fonte