In Ihrer ersten Abfrage erfolgt ORDER BY mit dem views_point
INDEX, weil es im WHERE-Teil der Abfrage verwendet wurde und daher in MySQL zum Sortieren verwendet werden kann.
In der zweiten Abfrage löst MySQL den WHERE-Teil mit einem anderen Index auf, listing_pcs
. Dies kann nicht verwendet werden, um die ORDER BY-Bedingung zu erfüllen. MySQL verwendet stattdessen Filesort, was die beste Option ist, wenn kein Index verwendet werden kann.
MySQL verwendet Indizes nur dann zum Sortieren, wenn der Index derselbe ist wie der in der WHERE-Bedingung verwendete. Dies ist das Handbuch bedeutet durch:
Was können Sie also tun:
-
Versuchen Sie, Ihre
sort_buffer_size
zu erhöhen config-Option, um die Dateisortierung so effektiv wie möglich zu gestalten. Große Ergebnisse, die zu groß für den Sortierpuffer sind, führen dazu, dass MySQL die Sortierung in Stücke zerlegt, was langsamer ist. -
Erzwinge, dass MySQL einen anderen Index wählt. Es ist erwähnenswert, dass verschiedene MySQL-Versionen Standardindizes unterschiedlich auswählen. Version 5.1 zum Beispiel ist ziemlich schlecht, da der Abfrageoptimierer für diese Version umfassend neu geschrieben wurde und viel Verfeinerung benötigte. Version 5.6 ist ziemlich gut.
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