Anda harus selalu menggunakan EXPLAIN
untuk menentukan bagaimana kueri Anda akan dijalankan.
Sayangnya, MySQL akan mengeksekusi subquery Anda sebagai DEPENDENT QUERY, yang berarti bahwa subquery akan dijalankan untuk setiap baris di kueri luar. Anda akan berpikir MySQL akan cukup pintar untuk mendeteksi bahwa subquery bukan subquery yang berkorelasi dan akan menjalankannya sekali saja, sayangnya, itu belum secerdas itu.
Jadi, MySQL akan memindai semua baris pada siswa, menjalankan subquery untuk setiap baris, dan tidak menggunakan indeks apa pun pada kueri luar sama sekali.
Menulis kueri sebagai GABUNG akan memungkinkan MySQL untuk menggunakan indeks, dan kueri berikut akan menjadi cara optimal untuk menulisnya:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Ini akan menggunakan indeks berikut:
students(`status`)
classes(`id`, `departements_id`) : multi-column index