Onde o MySQL armazena arquivos quando está copiando para a tabela tmp?

1

Eu tenho uma consulta que está atrasando, e não tenho idéia do porquê. Parece sensato, mas funciona "para sempre" (eu fui e almocei e deixei tudo funcionando, não terminei 20 minutos depois).

Olhando para "SHOW PROCESSLIST", vejo que minha conexão tem o status "Copiando para a tabela tmp".

Eu olhei no meu my.cnf, e parece que os arquivos temporários devem estar em / tmp, mas não há nada relacionado ao MySQL lá (há apenas dois diretórios, ambos vazios).

Para me ajudar a diagnosticar o que estava errado, pensei em dar uma olhada no arquivo temporário para o qual supostamente estava copiando. Se foi enorme, devo ter atrapalhado uma consulta. Se não, talvez seja um bug.

Mas não consigo descobrir onde está armazenando-os. É um "arquivo" na memória?

Estou executando o MySQL 5.1.31 em uma instalação do JeOS do Ubuntu 9.04.

    
por Drarok 13.08.2009 / 15:36

4 respostas

4

Muitas tabelas temporárias podem e serão criadas na memória. Se uma tabela será criada na memória ou no disco é determinada por alguns fatores, como tamanho da tabela, estrutura (possui BLOBs) e mais alguns.

Eu sugiro que você leia sobre TMP_TABLE_SIZE e MAX_HEAP_TABL \ E_SIZE para obter informações sobre como as tabelas temporárias funcionam.

Você pode verificar a saída de

mysql> show status like '%tmp%';

se você estiver realmente criando tabelas em disco. Observe, no entanto, que o arquivo de tabela temporária real será de pouca ou nenhuma ajuda para determinar se há um problema.

Você também pode tentar EXPLICAR sua consulta e ver como ela deve ser executada .

    
por 13.08.2009 / 15:57
4

no debian - por padrão em / tmp [afair]

sempre que tiver dúvidas, basta executar

lsof|grep -i mysqld

Os arquivos temporários do mysql são deletados logo após a criação - eles aparecem no lsof, mas não no ls; eles ocupam espaço em disco até que as alças de arquivos sejam fechadas.

    
por 13.08.2009 / 15:48
3

Depende de que tipo de tabela temporária. Se ele diz "Copiar para tabela temporária", então é uma cópia na memória. Se ele disser "Copiar para a tabela temporária no disco", ele excedeu o tamanho das tabelas temporárias na memória e está despejando no disco.

No caso deste último, ele será armazenado no local definido pela variável tmpdir . Você pode descobrir o que é definido por:

SHOW VARIABLES LIKE 'tmpdir';
    
por 13.08.2009 / 15:52
1

Existe uma variável mysql que indica onde os arquivos serão armazenados:

mysql> show variables like '%tmp%';

Procure pela variável tmpdir. Isso lhe dirá onde os arquivos tmp estão sendo armazenados. Se uma tabela temporária for menor que 'tmp_table_size', ela será baseada em memória e não em disco.

    
por 13.08.2009 / 15:57

Tags