sql >> Base de Datos >  >> RDS >> Mysql

El rendimiento de MYSQL es lento al usar filesort

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.