Mysql
 sql >> Database >  >> RDS >> Mysql

Le prestazioni di MySQL sono lente utilizzando filesort

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.