In uw eerste zoekopdracht wordt de ORDER BY gedaan met behulp van het views_point
INDEX, omdat het werd gebruikt in het WHERE-gedeelte van de zoekopdracht en daarom in MySQL kan worden gebruikt om te sorteren.
In de tweede query lost MySQL het WHERE-gedeelte op met een andere index, listing_pcs
. Dit kan niet worden gebruikt om te voldoen aan de ORDER BY-voorwaarde. MySQL gebruikt in plaats daarvan filesort, wat de beste optie is als een index niet kan worden gebruikt.
MySQL gebruikt alleen indexen om te sorteren als de index dezelfde is als die gebruikt in de WHERE-voorwaarde. Dit is wat de handleiding betekent door:
Dus wat kun je doen:
-
Probeer uw
sort_buffer_size
te vergroten config-optie om bestandssortering zo effectief mogelijk te maken. Grote resultaten die te groot zijn voor de sorteerbuffer, zorgen ervoor dat MySQL de sortering in stukken opdeelt, wat langzamer gaat. -
Forceer MySQL om een andere index te kiezen. Het is vermeldenswaard dat verschillende MySQL-versies standaardindexen anders kiezen. Versie 5.1 is bijvoorbeeld behoorlijk slecht omdat de Query Optimizer voor deze release enorm was herschreven en veel verfijning nodig had. Versie 5.6 is redelijk goed.
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