I din första fråga görs ORDER BY med hjälp av views_point
INDEX, eftersom det användes i WHERE-delen av frågan och därför i MySQL kan användas för sortering.
I den andra frågan löser MySQL WHERE-delen med ett annat index, listing_pcs
. Detta kan inte användas för att uppfylla ORDER BY-villkoret. MySQL använder istället filesort, vilket är det bästa alternativet om ett index inte kan användas.
MySQL använder bara index för att sortera om indexet är detsamma som det som används i WHERE-villkoret. Det här är handboken betyder genom:
Så vad kan du göra:
-
Prova att öka din
sort_buffer_size
config-alternativet för att göra filsortering så effektiv som möjligt. Stora resultat som är för stora för sorteringsbufferten gör att MySQL delar upp sorteringen i bitar, vilket är långsammare. -
Tvinga MySQL att välja ett annat index. Det är värt att notera att olika MySQL-versioner väljer standardindex på olika sätt. Version 5.1, till exempel, är ganska dålig eftersom Query Optimizer hade skrivits om mycket för den här utgåvan och behövde mycket förfining. Version 5.6 är ganska bra.
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