En su primera consulta, ORDER BY se realiza utilizando el views_point
ÍNDICE, porque se usó en la parte DONDE de la consulta y, por lo tanto, en MySQL se puede usar para clasificar.
En la segunda consulta, MySQL resuelve la parte WHERE usando un índice diferente, listing_pcs
. Esto no se puede utilizar para satisfacer la condición ORDER BY. MySQL usa filesort en su lugar, que es la mejor opción si no se puede usar un índice.
MySQL solo usa índices para ordenar si el índice es el mismo que se usó en la condición WHERE. Esto es lo que el manual significa por:
Entonces, ¿qué puedes hacer?:
-
Intenta aumentar tu
sort_buffer_size
opción de configuración para que la clasificación de archivos sea lo más efectiva posible. Los resultados grandes que son demasiado grandes para el búfer de clasificación hacen que MySQL divida la clasificación en fragmentos, lo que es más lento. -
Obligar a MySQL a elegir un índice diferente. Vale la pena señalar que las diferentes versiones de MySQL eligen los índices predeterminados de manera diferente. La versión 5.1, por ejemplo, es bastante mala ya que el Optimizador de consultas se reescribió en gran medida para esta versión y necesitaba muchas mejoras. La versión 5.6 es bastante buena.
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10