Masalahnya adalah MySQL hanya menggunakan satu indeks saat menjalankan kueri. Jika Anda menambahkan indeks baru yang menggunakan 3 bidang di WHERE
klausa, itu akan menemukan baris lebih cepat.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Menurut dokumentasi MySQL ORDER BY Optimization :
Inilah yang terjadi dalam kasus Anda. Sebagai output dari EXPLAIN
memberitahu kami, pengoptimal menggunakan kunci price
untuk menemukan baris. Namun, ORDER BY
ada di bidang date_updated
yang bukan milik kunci price
.
Untuk menemukan baris lebih cepat DAN mengurutkan baris lebih cepat, Anda perlu menambahkan indeks yang berisi semua bidang yang digunakan di WHERE
dan di ORDER BY
klausa:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
Bidang yang digunakan untuk menyortir harus berada di posisi terakhir dalam indeks. Tidak ada gunanya menyertakan price
dalam indeks, karena kondisi yang digunakan dalam kueri akan mengembalikan rentang nilai.
Jika EXPLAIN
masih menunjukkan bahwa ia menggunakan filesort, Anda dapat mencoba memaksa MySQL untuk menggunakan indeks yang Anda pilih:
SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC
LIMIT 19990, 10
Biasanya tidak perlu memaksakan indeks, karena pengoptimal MySQL paling sering melakukan pilihan yang benar. Tapi terkadang itu membuat pilihan yang buruk, atau bukan pilihan terbaik. Anda perlu menjalankan beberapa pengujian untuk melihat apakah itu meningkatkan kinerja atau tidak.