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
select
bidang 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
memory
tabel, yang disimpan dalam RAM. Jangan lakukan ini untuk tabel besar, ini akan memperlambat hal lain.
Anda hanya dapat menggunakanhash
indeks pada tabel memori. - Jika prodidnya kontinu, Anda dapat menggunakan
BETWEEN 1000 AND 1019
bukannyaIN (1000, 1001 ..., 1019)