Powinieneś zawsze używać EXPLAIN
aby określić, w jaki sposób zostanie uruchomione zapytanie.
Niestety, MySQL wykona Twoje podzapytanie jako ZALEŻNE ZAPYTANIE, co oznacza, że podzapytanie zostanie wykonane dla każdego wiersza w zewnętrznym zapytaniu. Można by pomyśleć, że MySQL byłby wystarczająco sprytny, aby wykryć, że podzapytanie nie jest skorelowanym podzapytaniem i uruchomiłby je tylko raz, niestety, nie jest jeszcze tak sprytne.
Tak więc MySQL przeskanuje wszystkie wiersze uczniów, uruchomi podzapytanie dla każdego wiersza i nie użyje żadnych indeksów w zapytaniu zewnętrznym.
Napisanie zapytania jako JOIN pozwoliłoby MySQL na wykorzystanie indeksów, a następujące zapytanie byłoby optymalnym sposobem na jego napisanie:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
To wykorzysta następujące indeksy:
students(`status`)
classes(`id`, `departements_id`) : multi-column index