Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho MYSQL lento usando filesort


O problema é que o MySQL usa apenas um índice ao executar a consulta. Se você adicionar um novo índice que usa os 3 campos em seu WHERE cláusula, ele encontrará as linhas mais rapidamente.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);

De acordo com a documentação do MySQL ORDER BY Optimization :

Isso é o que acontece no seu caso. Como a saída de EXPLAIN nos diz, o otimizador usa a chave price para encontrar as linhas. No entanto, o ORDER BY está no campo date_updated que não pertence à chave price .

Para encontrar as linhas mais rapidamente E classificar as linhas mais rapidamente, você precisa adicionar um índice que contenha todos os campos usados ​​no WHERE e no ORDER BY cláusulas:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);

O campo utilizado para ordenação deve estar na última posição do índice. É inútil incluir price no índice, pois a condição usada na consulta retornará um intervalo de valores.

Se EXPLAIN ainda mostra que está usando filesort, você pode tentar forçar o MySQL a usar um índice de sua escolha:
SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC 
LIMIT 19990, 10

Geralmente não é necessário forçar um índice, porque o otimizador MySQL geralmente faz a escolha correta. Mas às vezes faz uma má escolha, ou não a melhor escolha. Você precisará executar alguns testes para ver se melhora o desempenho ou não.