Dalam kueri pertama Anda, ORDER BY dilakukan menggunakan views_point
INDEX, karena digunakan di bagian WHERE dari kueri dan oleh karena itu di MySQL dapat digunakan untuk menyortir.
Dalam kueri kedua, MySQL menyelesaikan bagian WHERE menggunakan indeks yang berbeda, listing_pcs
. Ini tidak dapat digunakan untuk memenuhi kondisi ORDER BY. MySQL menggunakan filesort sebagai gantinya, yang merupakan opsi terbaik jika indeks tidak dapat digunakan.
MySQL hanya menggunakan indeks untuk mengurutkan jika indeks sama dengan yang digunakan pada kondisi WHERE. Inilah manual dimaksud dengan:
Jadi apa yang bisa kamu lakukan:
-
Coba tingkatkan
sort_buffer_size
your Anda config untuk membuat penyortiran file seefektif mungkin. Hasil besar yang terlalu besar untuk buffer pengurutan menyebabkan MySQL memecah pengurutan menjadi beberapa bagian, yang lebih lambat. -
Paksa MySQL untuk memilih indeks yang berbeda. Perlu dicatat bahwa versi MySQL yang berbeda memilih indeks default secara berbeda. Versi 5.1, misalnya, sangat buruk karena Pengoptimal Kueri telah banyak ditulis ulang untuk rilis ini dan membutuhkan banyak penyempurnaan. Versi 5.6 cukup bagus.
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