Vous devez toujours utiliser EXPLAIN
pour déterminer comment votre requête s'exécutera.
Malheureusement, MySQL exécutera votre sous-requête en tant que REQUÊTE DÉPENDANTE, ce qui signifie que la sous-requête sera exécutée pour chaque ligne de la requête externe. On pourrait penser que MySQL serait assez intelligent pour détecter que la sous-requête n'est pas une sous-requête corrélée et ne l'exécuterait qu'une seule fois, hélas, ce n'est pas encore si intelligent.
Ainsi, MySQL analysera toutes les lignes des étudiants, exécutant la sous-requête pour chaque ligne et n'utilisant aucun index sur la requête externe.
Écrire la requête en tant que JOIN permettrait à MySQL d'utiliser des index, et la requête suivante serait la meilleure façon de l'écrire :
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Cela utiliserait les index suivants :
students(`status`)
classes(`id`, `departements_id`) : multi-column index