Как сказал gmb, в вашем запросе нет ничего особенно плохого; но, как и в большинстве запросов, существуют альтернативы с различными характеристиками производительности. Как и то, что я приведу ниже, вероятно, будет работать так же или лучше, чем у вас. Ваши подзапросы коррелированы, что означает, что они, вероятно, будут повторяться для каждого результата внешнего запроса; этот будет выполнять подзапросы только один раз, а затем использовать индексы для относительно быстрых объединений.
SELECT t.tch_name, tsc.sCount as TotalStd, tlc.lCount as TotalLes
FROM teachers AS t
LEFT JOIN (
SELECT std_tch_id AS tch_id, COUNT(std_id) AS sCount
FROM students
GROUP BY std_tch_id
) AS tsc ON t.tch_id = tsc.tch_id
LEFT JOIN (
SELECT les_tch_id AS tch_id, COUNT(les_id) AS lCount
FROM lessons
GROUP BY les_tch_id
) AS tlc ON t.tch_id = tlc.tch_id
ORDER BY t.tch_id;
Однако, если последний запрос несколько отличается, ваш может работать лучше. Например ... Если каждая таблица имеет миллион строк, но внешний запрос имеет условие WHERE, которое быстро сужает его до дюжины строк из таблицы teacher
, тогда выполняются ваши подзапросы (которые рассчитывают количество для одного учителя ) в дюжину раз каждый может быть дешевле, чем выполнение моего (то есть подсчета всех учителей в двух других таблицах) один раз.
В любом случае, обеспечение индексации teachers.tch_id
, students.std_tch_id
и lessons.les_tch_id
, вероятно, является наиболее важным фактором для этих запросов