Du bør altid bruge EXPLAIN
for at bestemme, hvordan din forespørgsel skal køre.
Desværre vil MySQL udføre din underforespørgsel som en AFHÆNGIG FORESPØRGSEL, hvilket betyder, at underforespørgslen vil blive kørt for hver række i den ydre forespørgsel. Du skulle tro, at MySQL ville være smart nok til at opdage, at underforespørgslen ikke er en korreleret underforespørgsel og ville køre den én gang, desværre er den ikke så smart endnu.
Så MySQL vil scanne gennem alle rækkerne i eleverne, køre underforespørgslen for hver række og ikke bruge nogen som helst indekser på den ydre forespørgsel overhovedet.
At skrive forespørgslen som en JOIN ville give MySQL mulighed for at bruge indekser, og følgende forespørgsel ville være den optimale måde at skrive den på:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Dette ville bruge følgende indekser:
students(`status`)
classes(`id`, `departements_id`) : multi-column index