Eu tenho uma consulta que está suspensa (aparentemente) aleatoriamente em uma consulta específica. A maioria dos usuários do meu site não tem problemas quando essa consulta é executada, mas alguns usuários estão tendo problemas de tempo limite no site e, quando eu verifico processlist
, ele fica travado copying to tmp table
.
Eu acredito que o disco rígido simplesmente não está acompanhando, o que está causando o travamento na cópia para a tabela tmp.
Não acredito que possa otimizar a consulta com mais eficiência. Eu queria saber se eu poderia configurar o segundo disco rígido do meu servidor como o armazenamento da tabela temporária para distribuir parte da carga colocada no servidor.
The query:
SELECT DISTINCT
activity_seismo_info.ID,
activity_seismo_info.CREATED_AT,
activity_seismo_info.UPDATED_AT,
....
activity_seismo_info.ASI_EXTRA_5,
seismo.ID,
....
seismo.SEISMO_NOTES
FROM `activity_seismo_info`
JOIN activity_info ON (activity_seismo_info.ASI_ACTIVITY_ID=activity_info.ID)
JOIN location ON (activity_info.ACTIVITY_LOCATION_ID=location.ID)
LEFT JOIN seismo ON (activity_seismo_info.ASI_SEISMO_ID=seismo.ID)
WHERE location.ID='193'
ORDER BY activity_info.ACTIVITY_EVENT_TIME DESC LIMIT 30
Estou em um P4 com 2 GB de RAM e dois discos rígidos (o segundo disco rígido não é usado)
PHP5.2
MySQL 5.0.51a-3ubuntu5.4
Aplicação symfony 1.2 com Propel
ATUALIZAR
graças à sugestão do @DTest, descobri que minha consulta estava retornando todas as linhas da tabela antes de executar um limite no resultado. Mas, para referência futura, existe uma maneira de configurar o MySQL para usar um segundo disco rígido como a unidade de 'zero' para tabelas temporárias?
Em
my.cnf
uso esta opçãotmpdir=/tmp
(este é o padrão de qualquer maneira, basta escolher outra pasta)Reinicialização do mysql necessária
Aliás, já que
location.ID
é'193'
por isso que envolve a tabela de localização ???Tente o seguinte: