Por que o MySQL está criando tantas tabelas temporárias em disco?

13

Qualquer erro de configuração pode levar à criação de muitas tabelas temporárias pelo mysql..mysql tuner shows

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk

table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%

A tabela temporária anterior era "das 23725 tabelas temporárias, 38% foram criadas no disco", mas eu mudei max_heap e tmp_table para 200m de 16m para 200m e baixei para 30%.

Configuração:

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800

Outro sistema com configuração padrão está exibindo "de 23725 tabelas temporárias, 1% foram criadas em disco" com o mesmo banco de dados.

Tentei mudar para o padrão na máquina com esse problema e ele ainda mostra "Das 580 tabelas temporárias, 16% foram criadas no disco".

Estou usando o Ubuntu 11.4 de 64 bits com 48 gb de ram. Alguém pode sugerir uma solução?

Alterar o mecanismo db de "myisam" para "memory" nas tabelas usando "group by" corrige isso? Conforme explicado aqui: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

ananthan.nair
fonte

Respostas:

16

O mysqltuner raramente fornece qualquer informação útil. Ele usa estatísticas principalmente irrelevantes sobre "taxas de acerto" e coloca limites arbitrários sobre o que é um número aceitável de widgets aceitáveis. Se você não está enfrentando um problema de desempenho, não precisa resolver nenhum dos problemas que ele apresenta. Dito isto, aqui estão algumas informações básicas sobre tabelas temporárias ...

O MySQL usa internamente o mecanismo de armazenamento MEMORY para criar tabelas temporárias implícitas. No disco, as tabelas temporárias usam o mecanismo de armazenamento MyISAM.

As tabelas temporárias são criadas no disco quando:

  • Os campos TEXT ou BLOB estão presentes (porque MEMORY não suporta esses tipos)
  • o tamanho da tabela temporária implícita resultante excede o menor tmp_table_sizeou o menormax_heap_table_size
  • Se uma coluna com mais de 512 bytes for usada com GROUP BY ou UNION ou ORDER BY

Leia a documentação do MySQL em tabelas temporárias internas para obter mais detalhes.

O que você pode fazer em relação à isso? Presumindo que realmente represente um problema de desempenho (em vez de apenas incomodá-lo intelectualmente):

  • Evite os campos TEXT / BLOB e, em vez disso, use campos VARCHAR ou CHAR de tamanho apropriado, sempre que possível.
  • Se TEXT / BLOB for inevitável, sequestrá-los para separar tabelas com um relacionamento de chave estrangeira e JOIN apenas quando você precisar.
  • Trate colunas grandes, com mais de 512 bytes, como faria nos campos TEXT / BLOB mencionados acima.
  • Verifique se suas consultas estão retornando apenas o conjunto de resultados que você precisa (cláusulas WHERE adequadamente seletivas, evite SELECT *)
  • Evite subconsultas e substitua-as por junções, especialmente se elas retornarem um grande conjunto de resultados
  • Último recurso - crie ambos tmp_table_sizee max_heap_table_size. Não faça isso a menos que você ache que suas consultas não podem ser otimizadas.

Se você está preocupado com a sua configuração do MySQL e não se sente à vontade com as configurações disponíveis, consulte o Assistente de Configuração Percona como ponto de partida.

Alterar o mecanismo db de "myisam" para "memory" nas tabelas usando "group by" corrige isso? como explicado aqui

Não, não será e fará com que suas tabelas nunca sejam mantidas em disco. Não faça isso.

Aaron Brown
fonte
+1, mas acrescentou que é o menor de tmp_table_sizeoumax_heap_table_size
Derek Downey
A melhor recomendação do mysqltuner foi habilitar o log de consultas lento. Isso o ajudará a identificar consultas lentas, se houver.
2141717 fat_mike
2

"using temporary" e "using filesort" não são o fim do mundo!

SELECIONE ... GRUPO POR a, b PEDIDO POR c, d - Requer 1 ou 2 "tabelas temporárias".

Há simplesmente momentos em que suas consultas usam tabelas temporárias. As tabelas temporárias podem atrasar uma consulta por um pequeno fator. Mas se a consulta ainda for "rápida o suficiente", não se preocupe.

Se a consulta for muito lenta (com ou sem tabelas tmp), vamos discuti-la. Forneça SHOW CREATE TABLE, SHOW TABLE STATUS e EXPLAIN.

Rick James
fonte
1
Se você tiver um índice (a, b, c, d), não haverá nenhuma tabela temporária.
Yvan