Tulis kueri dengan cara ini:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Jangan tentukan indeks apa yang akan digunakan.
Dimulai dengan WHERE
klausa, sepertinya ini mungkin berguna:INDEX(status)
. Namun karena "status" terdengar seperti "bendera" dengan kardinalitas rendah, pengoptimal mungkin memutuskan untuk mengabaikan indeks dan hanya melakukan pemindaian tabel. Tidak apa-apa. Tidak apa-apa karena lebih cepat melakukan pemindaian tabel daripada memantul antara indeks dan data, ketika indeks tidak terlalu selektif. Bagaimanapun, serahkan keputusan pada Pengoptimal.
Sekarang berurusan dengan orders
, perlu JOIN
kepada users
. Satu-satunya cara untuk melakukannya adalah dengan memiliki indeks di id
. Nama itu ("id") menyiratkan bahwa itu mungkin PRIMARY KEY
, Apakah itu? (Harap berikan SHOW CREATE TABLE
.)
Kueri lain yang Anda sebutkan harus ditulis
SELECT * FROM users WHERE id=33
Dan, seperti yang telah dibahas, indeks (PRIMARY KEY
?) pada id
adalah hal yang benar.
Tidak ada keuntungan (untuk SELECTs
yang diberikan , setidaknya) untuk INDEX(status, id_user)
. Pilihan Anda mencakup semua kolom (*
); itu hanya mengambil id_user
, maka indeks semacam itu akan "menutupi", dan memiliki beberapa keuntungan.