![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быстрее с подзапросом или с присоединением сгруппированной..? [MySQL]
Дмитрий С © (2011-03-21 06:16:00)Есть таблица материалов и таблица выполненных работ над этими материалами: `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 ...
?
OW (2011-03-24 14:47:00) [1]
> Кщд (23.03.11 10:14) [6]
ну может и не лучший вариант, из общих соображений сказал
Кщд (2011-03-23 10:14:00) [2]>OW © (22.03.11 12:58) [5]
для чего делать FTS по всей таблице `work`, если "Выбирается обычно штук 100 строк из таблицы `resource`"?
OW (2011-03-22 12:58:00) [3]
> Кщд (22.03.11 12:04) [4]
да
Кщд (2011-03-22 12:04:00) [4]>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 ...
?
OW (2011-03-22 11:50:00) [5]
> с присоединением сгруппированной.
имхо
Sergey13 (2011-03-21 10:56:00) [6]> [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`.* надо подробно переписать.
Loginov Dmitry (2011-03-21 08:13:00) [7]
> Как быстрее с подзапросом или с присоединением сгруппированной
Имхо, самое правильное - сгенерировать солидный объем тестовых данных и на них эксперементировать. Например 1000 строк для таблицы resource и 1000000 строк для таблицы work. А далее - перебирать варианты. Думаю, какие-то из них будут часами шуршать, а каким-то хватит и пару секунд.
Важно, чтобы поля id, resource_id, supply_id были проиндексированными.