Siempre debes usar EXPLAIN
para determinar cómo se ejecutará su consulta.
Desafortunadamente, MySQL ejecutará su subconsulta como una CONSULTA DEPENDIENTE, lo que significa que la subconsulta se ejecutará para cada fila en la consulta externa. Uno pensaría que MySQL sería lo suficientemente inteligente como para detectar que la subconsulta no es una subconsulta correlacionada y la ejecutaría solo una vez, por desgracia, todavía no es tan inteligente.
Por lo tanto, MySQL escaneará todas las filas de los estudiantes, ejecutará la subconsulta para cada fila y no utilizará ningún índice en la consulta externa.
Escribir la consulta como JOIN permitiría a MySQL utilizar índices, y la siguiente consulta sería la forma óptima de escribirla:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Esto utilizaría los siguientes índices:
students(`status`)
classes(`id`, `departements_id`) : multi-column index