Você deve sempre usar
EXPLAIN
para determinar como sua consulta será executada. Infelizmente, o MySQL executará sua subconsulta como DEPENDENT QUERY, o que significa que a subconsulta será executada para cada linha na consulta externa. Você pensaria que o MySQL seria inteligente o suficiente para detectar que a subconsulta não é uma subconsulta correlacionada e a executaria apenas uma vez, infelizmente, ainda não é tão inteligente.
Assim, o MySQL examinará todas as linhas nos alunos, executando a subconsulta para cada linha e não utilizando nenhum índice na consulta externa.
Escrever a consulta como um JOIN permitiria ao MySQL utilizar índices, e a consulta a seguir seria a melhor maneira de escrevê-la:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Isso utilizaria os seguintes índices:
students(`status`)
classes(`id`, `departements_id`) : multi-column index