W pierwszym zapytaniu ORDER BY odbywa się za pomocą views_point
INDEX, ponieważ został użyty w części WHERE zapytania, a zatem w MySQL może służyć do sortowania.
W drugim zapytaniu MySQL rozwiązuje część WHERE przy użyciu innego indeksu, listing_pcs
. Nie można tego użyć do spełnienia warunku ORDER BY. MySQL używa sortowania plików, co jest najlepszą opcją, jeśli nie można użyć indeksu.
MySQL używa indeksów do sortowania tylko wtedy, gdy indeks jest taki sam, jak użyty w warunku WHERE. To jest instrukcja oznacza:
Więc co możesz zrobić:
-
Spróbuj zwiększyć swój
sort_buffer_size
opcja konfiguracji, aby sortowanie plików było jak najbardziej efektywne. Duże wyniki, które są zbyt duże dla bufora sortowania, powodują, że MySQL dzieli sortowanie na kawałki, co jest wolniejsze. -
Zmuś MySQL do wybrania innego indeksu. Warto zauważyć, że różne wersje MySQL w różny sposób wybierają domyślne indeksy. Na przykład wersja 5.1 jest dość zła, ponieważ Optymalizator zapytań został znacznie przepisany w tym wydaniu i wymagał wielu poprawek. Wersja 5.6 jest całkiem dobra.
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