Il problema è che MySQL utilizza solo un indice durante l'esecuzione della query. Se aggiungi un nuovo indice che utilizza i 3 campi nel tuo WHERE
clausola, troverà le righe più velocemente.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Secondo la documentazione MySQL ORDER BY Optimization :
Questo è ciò che accade nel tuo caso. Come output di EXPLAIN
ci dice che l'ottimizzatore usa la chiave price
per trovare le righe. Tuttavia, il ORDER BY
si trova nel campo date_updated
che non appartiene alla chiave price
.
Per trovare le righe più velocemente E ordinare le righe più velocemente, è necessario aggiungere un indice che contenga tutti i campi utilizzati nel WHERE
e nel ORDER BY
clausole:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
Il campo utilizzato per l'ordinamento deve trovarsi nell'ultima posizione dell'indice. È inutile inserire il price
nell'indice, perché la condizione utilizzata nella query restituirà un intervallo di valori.
Se EXPLAIN
mostra ancora che sta usando filesort, puoi provare a forzare MySQL a usare un indice che scegli:
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
Di solito non è necessario forzare un indice, perché l'ottimizzatore MySQL esegue molto spesso la scelta corretta. Ma a volte fa una scelta sbagliata, o non la scelta migliore. Dovrai eseguire alcuni test per vedere se migliora le prestazioni o meno.