Du bör alltid använda EXPLAIN
för att avgöra hur din fråga kommer att köras.
Tyvärr kommer MySQL att köra din underfråga som en BEROENDE FRÅGA, vilket innebär att underfrågan kommer att köras för varje rad i den yttre frågan. Man skulle kunna tro att MySQL skulle vara smart nog att upptäcka att underfrågan inte är en korrelerad underfråga och skulle köra den bara en gång, tyvärr är den inte så smart än.
Så MySQL kommer att skanna igenom alla rader i eleverna, köra underfrågan för varje rad och inte använda några som helst index på den yttre frågan.
Att skriva frågan som en JOIN skulle tillåta MySQL att använda index, och följande fråga skulle vara det optimala sättet att skriva den:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Detta skulle använda följande index:
students(`status`)
classes(`id`, `departements_id`) : multi-column index