Vždy byste měli používat EXPLAIN
určit, jak bude dotaz probíhat.
Bohužel MySQL provede váš poddotaz jako DEPENDENT QUERY, což znamená, že poddotaz bude spuštěn pro každý řádek ve vnějším dotazu. Mysleli byste si, že MySQL by bylo dostatečně chytré na to, aby zjistilo, že poddotaz není korelovaný poddotaz, a spustilo by ho jen jednou, bohužel, ještě to tak chytré není.
MySQL tedy prohledá všechny řádky ve studentech, spustí poddotaz pro každý řádek a nepoužije žádné indexy na vnějším dotazu.
Zápis dotazu jako JOIN by umožnil MySQL využívat indexy a následující dotaz by byl optimální způsob, jak jej napsat:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
To by využilo následující indexy:
students(`status`)
classes(`id`, `departements_id`) : multi-column index