常にEXPLAIN
を使用する必要があります クエリの実行方法を決定します。
残念ながら、MySQLはサブクエリをDEPENDENT QUERYとして実行します。つまり、サブクエリは外部クエリの各行に対して実行されます。 MySQLは、サブクエリが相関サブクエリではないことを検出するのに十分スマートであり、1回だけ実行されると思いますが、残念ながら、まだそれほどスマートではありません。
したがって、MySQLは学生のすべての行をスキャンし、各行に対してサブクエリを実行し、外部クエリのインデックスをまったく利用しません。
クエリをJOINとして記述すると、MySQLでインデックスを利用できるようになり、次のクエリが最適な記述方法になります。
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
これは次のインデックスを利用します:
students(`status`)
classes(`id`, `departements_id`) : multi-column index