-
Есть таблица материалов и таблица выполненных работ над этими материалами: `resource` и `work` Необходимо выбрать из таблицы `resource` строки, и к каждой из них присоединить количество соответствующих строк из таблица `work`. Работ обычно 5-6 на материал. Выбирается обычно штук 100 строк из таблицы `resource`. Условие выборки не зависит от количество. Как быстрее: SELECT `r`.*, (SELECT COUNT(*) FROM `work` WHERE `resource_id`=`r`.`id`) `count` FROM `resource` `r` WHERE ... или SELECT `r`.*, `wc`.`count` FROM `resource` `r` LEFT JOIN (SELECT `supply_id`, COUNT(*) FROM `work` GROUP BY `supply_id`) `wc` ON `wc`.`supply_id` = `r`.`id` WHERE ... ?
-
> Как быстрее с подзапросом или с присоединением сгруппированной
Имхо, самое правильное - сгенерировать солидный объем тестовых данных и на них эксперементировать. Например 1000 строк для таблицы resource и 1000000 строк для таблицы work. А далее - перебирать варианты. Думаю, какие-то из них будут часами шуршать, а каким-то хватит и пару секунд. Важно, чтобы поля id, resource_id, supply_id были проиндексированными.
-
> [0] Дмитрий С © (21.03.11 06:16) Я конечно доснонально не всматривался в твои запросы, но мне почему то кажется, что возможен вариант и без подзапросов. типа такого SELECT `r`.*, `wc`.`count`
FROM `resource` `r`,`work` wc
WHERE `wc`.`supply_id` = `r`.`id`
and ....
group by `r`.* только `r`.* надо подробно переписать.
-
> с присоединением сгруппированной.
имхо
-
>OW © (22.03.11 11:50) [3]имеете в виду:
SELECT `r`.*, `wc`.`count`
FROM `resource` `r`
LEFT JOIN (SELECT `supply_id`, COUNT(*) FROM `work` GROUP BY `supply_id`) `wc` ON `wc`.`supply_id` = `r`.`id`
WHERE ...
?
-
> Кщд (22.03.11 12:04) [4]
да
-
>OW © (22.03.11 12:58) [5] для чего делать FTS по всей таблице `work`, если "Выбирается обычно штук 100 строк из таблицы `resource`"?
-
> Кщд (23.03.11 10:14) [6]
ну может и не лучший вариант, из общих соображений сказал
|