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.