В първата ви заявка ORDER BY се извършва с помощта на views_point
INDEX, защото е използван в частта WHERE на заявката и следователно в MySQL може да се използва за сортиране.
Във втората заявка MySQL разрешава частта WHERE, използвайки различен индекс, listing_pcs
. Това не може да се използва за удовлетворяване на условието ORDER BY. Вместо това MySQL използва сортиране на файлове, което е най-добрият вариант, ако не може да се използва индекс.
MySQL използва индекси само за сортиране, ако индексът е същият като този, използван в условието WHERE. Ето какво ръководството означава чрез:
И така, какво можете да направите:
-
Опитайте да увеличите своя
sort_buffer_size
опция config, за да направи сортирането на файлове възможно най-ефективно. Големи резултати, които са твърде големи за буфера за сортиране, карат MySQL да разбие сортирането на парчета, което е по-бавно. -
Принуди MySQL да избере различен индекс. Струва си да се отбележи, че различните версии на MySQL избират индексите по подразбиране по различен начин. Версия 5.1, например, е доста лоша, тъй като оптимизаторът на заявки беше значително пренаписан за тази версия и се нуждаеше от много усъвършенстване. Версия 5.6 е доста добра.
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