Предположим, у меня есть таблицы 1-4, все остальные таблицы связаны с таблицей1.Для чего стоит table1, table2 и table3 относительно малы, но table4 содержит много данных.
Теперь у меня есть следующий запрос:
SELECT t1.id
, (SELECT COUNT(*) FROM table2 WHERE table1_id = t1.id) AS t2_count
, (SELECT COUNT(*) FROM table3 WHERE table1_id = t1.id) AS t3_count
, (SELECT COUNT(*) FROM table4 WHERE table1_id = t1.id) AS t4_count
FROM table1 t1
Из-за того, что подзапросыявляются зависимыми / коррелированными. Я предположил, что должен быть лучший способ (с точки зрения производительности) для получения данных.
Я пытался сделать следующее, но это резко увеличило время выполнения (примерно с 2 до 35 с).Я предполагаю, что множественные левые объединения создают очень большой набор данных?!
SELECT t1.id
, COUNT(t2.id) AS t2_count
, COUNT(t3.id) AS t3_count
, COUNT(t4.id) AS t4_count
FROM table1 t1
LEFT JOIN table2 t2 ON t2.table1_id = t1.id
LEFT JOIN table3 t3 ON t3.table1_id = t1.id
LEFT JOIN table4 t4 ON t4.table1_id = t1.id
GROUP BY t1.id
Есть ли лучший способ получить количество?Мне не нужны данные из других таблиц.
ОБНОВЛЕНИЕ:
Ответ Барта заставил меня подумать, что столбцы table1_id
обнуляемый.Я добавил IS NOT NULL
чек к пунктам WHERE
, и это сократило время до 1 с.
SELECT t1.id
, (SELECT COUNT(*) FROM table2 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t2_count
, (SELECT COUNT(*) FROM table3 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t3_count
, (SELECT COUNT(*) FROM table4 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t4_count
FROM table1 t1