El problema es que MySQL solo usa un índice al ejecutar la consulta. Si agrega un nuevo índice que usa los 3 campos en su WHERE
cláusula, encontrará las filas más rápido.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Según la documentación de MySQL ORDER BY Optimization :
Esto es lo que sucede en su caso. Como resultado de EXPLAIN
nos dice, el optimizador usa la clave price
para encontrar las filas. Sin embargo, el ORDER BY
está en el campo date_updated
que no pertenece a la clave price
.
Para encontrar las filas más rápido Y ordenar las filas más rápido, debe agregar un índice que contenga todos los campos utilizados en WHERE
y en el ORDER BY
cláusulas:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
El campo utilizado para ordenar debe estar en la última posición del índice. De nada sirve incluir price
en el índice, porque la condición utilizada en la consulta devolverá un rango de valores.
Si EXPLAIN
aún muestra que está usando filesort, puede intentar forzar a MySQL a usar un índice que elija:
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
Por lo general, no es necesario forzar un índice, porque el optimizador de MySQL suele hacer la elección correcta. Pero a veces hace una mala elección, o no la mejor elección. Deberá realizar algunas pruebas para ver si mejora el rendimiento o no.