SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Pertama-tama letakkan indeks di prodid lihat jawaban @ Anthony.
Daripada mengubah kueri untuk membaca:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Jika Anda memastikan IN list diurutkan naik sebelum menawarkannya ke IN klausa, order by prodid akan menghasilkan hasil yang sama als order by field(...
- Menggunakan fungsi alih-alih bidang menghilangkan peluang penggunaan indeks, menyebabkan kelambatan.
select *akan mengambil data yang mungkin tidak Anda perlukan, menyebabkan akses disk ekstra, dan penggunaan memori ekstra dan lalu lintas jaringan ekstra.- Di InnoDB, jika Anda hanya
selectbidang yang diindeks, MySQL tidak akan pernah membaca tabel, tetapi hanya indeks yang menghemat waktu (dalam kasus Anda ini mungkin bukan masalah)
Ada beberapa trik yang bisa Anda gunakan.
- Jika tabel produk tidak terlalu besar, Anda bisa menjadikannya sebagai
memorytabel, yang disimpan dalam RAM. Jangan lakukan ini untuk tabel besar, ini akan memperlambat hal lain.
Anda hanya dapat menggunakanhashindeks pada tabel memori. - Jika prodidnya kontinu, Anda dapat menggunakan
BETWEEN 1000 AND 1019bukannyaIN (1000, 1001 ..., 1019)