Nella tua prima query, ORDER BY viene eseguito utilizzando il views_point
INDEX, perché è stato utilizzato nella parte WHERE della query e quindi in MySQL può essere utilizzato per l'ordinamento.
Nella seconda query, MySQL risolve la parte WHERE utilizzando un indice diverso, listing_pcs
. Questo non può essere utilizzato per soddisfare la condizione ORDER BY. MySQL utilizza invece filesort, che è l'opzione migliore se non è possibile utilizzare un indice.
MySQL utilizza gli indici solo per ordinare se l'indice è lo stesso utilizzato nella condizione WHERE. Questo è il il manuale significa con:
Allora cosa puoi fare:
-
Prova ad aumentare il tuo
sort_buffer_size
config per rendere l'ordinamento dei file il più efficace possibile. Risultati di grandi dimensioni troppo grandi per il buffer di ordinamento fanno sì che MySQL scomponga l'ordinamento in blocchi, il che è più lento. -
Forza MySQL a scegliere un indice diverso. Vale la pena notare che diverse versioni di MySQL scelgono gli indici predefiniti in modo diverso. La versione 5.1, ad esempio, è piuttosto scadente in quanto Query Optimizer è stato ampiamente riscritto per questa versione e necessitava di molti perfezionamenti. La versione 5.6 è abbastanza buona.
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