Eu tive esse problema, exceto com o MySQL. Havia uma página de administração que demorava muito tempo para ser carregada (15 segundos), mas a consulta mais lenta durava apenas alguns segundos. Horas de depuração depois, descobri o que era.
O servidor de banco de dados mysql estava de fato retornando os resultados da consulta em apenas alguns segundos, mas a consulta não tinha sido completamente processada (até o fim da vida, incluindo a limpeza) até após os resultados retornaram. Aqui está uma explicação passo-a-passo do que estava acontecendo:
- A consulta cara atinge o db
- O servidor MySQL retorna os resultados da consulta após alguns segundos, mas continua trabalhando na limpeza (a consulta ainda não atingiu o fim da vida útil no que diz respeito ao servidor mysql). O tempo gasto para esta consulta, como mostrado na barra de ferramentas de depuração do django (e django.db.connection.queries), pára a temporização quando os resultados retornam.
- O Django recupera os resultados e continua carregando a página enquanto, ao mesmo tempo, em segundo plano , o mysql continua limpando a tabela temporária usada.
- O Django prepara outra consulta SQL e a envia para o servidor.
- O MySQL ainda não terminou de limpar a tabela temporária, portanto ...
- Django tem que sentar e esperar. O Django está usando a mesma conexão db mysql como antes, e o mysql não permitirá que a mesma conexão execute outra consulta até que a anterior tenha atingido o final da vida, incluindo a limpeza.
Eu percebi isso executando "show full processlist;" em um prompt de comando do mysql. Para todas as consultas pendentes, ele mostra o tempo gasto na consulta (até o momento), o status e o texto da consulta real. Três ou quatro segundos depois de iniciar a consulta cara, ela começaria a mostrar "removendo a tabela tmp" como o status. Ele mostraria isso por até 7 segundos após a consulta já ter retornado resultados para o Django. Então, aparentemente, o MySQL demorava muito mais tempo para limpar a consulta do que retornar resultados. Este é exatamente o problema, no meu caso.
Curiosamente, o horário de "limpeza" não apareceu nos tempos de consulta da consulta incorreta nem na consulta de acompanhamento cujo início foi realmente atrasado.
Não tenho certeza se isso é problema seu, mas acho que vale a pena investigar.