Existem algumas opções que podem fazer com que as tabelas temporárias se materializem como tabelas MyISAM ou podem ser configuradas para atrasá-las. Tenha em mente que, para tabelas temporárias com base em disco, não há .frm
arquivos, mas somente .MYD
e .MYI
arquivos (de curso. Arquivo .MYI nunca é usada, uma vez que é o índice impossível uma tabela temporária interna).
Aqui estão as opções:
Você também deve considerar a documentação do MySQL sobre o uso da tabela temporária interna
As situações em que são criadas tabelas temporárias na memória são
- Se houver uma cláusula ORDER BY e uma cláusula GROUP BY diferente, ou se a ORDER BY ou GROUP BY contiver colunas de tabelas diferentes da primeira tabela na fila de junção, uma tabela temporária será criada.
- DISTINCT combinado com ORDER BY pode exigir uma tabela temporária.
- Se você usar a opção SQL_SMALL_RESULT, o MySQL usará uma tabela temporária na memória, a menos que a consulta também contenha elementos (descritos mais adiante) que requerem armazenamento em disco.
Quando uma tabela temporária na memória excede o mínimo de (tmp_table_size ou max_heap_table_size), o mysqld faz o seguinte:
- Suspende a consulta
- Copia o conteúdo da tabela na memória para uma tabela temporária MyISAM
- Descarta a tabela na memória
- Continua a consulta, enviando os dados temporários para a tabela temporária MyISAM
As situações em que as tabelas temporárias na memória são ignoradas em favor do disco são
- Presença de uma coluna BLOB ou TEXT na tabela
- Presença de qualquer coluna em uma cláusula GROUP BY ou DISTINCT maior que 512 bytes
- Presença de qualquer coluna maior que 512 bytes na lista SELECT, se UNION ou UNION ALL for usado
É necessária alguma diligência para reduzir a criação da tabela temporária no disco
- Definindo join_buffer_size maior
- Definir sort_buffer_size maior
- Definindo tmp_table_size e max_heap_table_size maior
- Ajustando consultas para minimizar ou mesmo impedir tabelas temporárias
- Criando índices para criar visualização pré-classificada de dados de tabelas individuais
- Instalando RAM adicional para acomodar grandes tabelas temporárias na memória
Se após essa devida diligência, ainda houver tabelas temporárias sendo formadas no Disco, aqui está uma jogada desesperada: Mapeando a criação da tabela temporária baseada em disco na memória.
Aqui está uma maneira rápida e suja de configurar um disco de 16 GB de RAM usando tmpdir
PASSO01) Criar pasta de disco RAM
mkdir /var/mysql_tmpfs
STEP02) Adicione isso ao my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
PASSO03) Adicione isso ao / etc / fstab
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
PASSO04) Recarregar / etc / fstab
mount -a
PASSO05) service mysql restart
Depois disso, todas as tabelas temporárias que se tornam MyISAM são gravadas no disco RAM. Isso deve acelerar a criação da tabela temporária baseada em disco.
De uma chance !!!
filesort
, e 6405 é o PID do mysql para manter os arquivos temporários de diferentes instâncias do servidor separados.