Конференция "Базы" » Как быстрее с подзапросом или с присоединением сгруппированной..? [MySQL]
 
  • Дмитрий С © (21.03.11 06:16) [0]
    Есть таблица материалов и таблица выполненных работ над этими материалами: `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 ...
    ?
  • Loginov Dmitry © (21.03.11 08:13) [1]

    > Как быстрее с подзапросом или с присоединением сгруппированной


    Имхо, самое правильное - сгенерировать солидный объем тестовых данных и на них эксперементировать. Например 1000 строк для таблицы resource и 1000000 строк для таблицы work. А далее - перебирать варианты. Думаю, какие-то из них будут часами шуршать, а каким-то хватит и пару секунд.
    Важно, чтобы поля id, resource_id, supply_id были проиндексированными.
  • Sergey13 © (21.03.11 10:56) [2]
    > [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]

    > с присоединением сгруппированной.

    имхо
  • Кщд (22.03.11 12:04) [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 © (22.03.11 12:58) [5]

    > Кщд   (22.03.11 12:04) [4]

    да
  • Кщд (23.03.11 10:14) [6]
    >OW ©   (22.03.11 12:58) [5]
    для чего делать FTS по всей таблице `work`, если "Выбирается обычно штук 100 строк из таблицы `resource`"?
  • OW © (24.03.11 14:47) [7]

    > Кщд   (23.03.11 10:14) [6]

    ну может и не лучший вариант,  из общих соображений сказал
 
Конференция "Базы" » Как быстрее с подзапросом или с присоединением сгруппированной..? [MySQL]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]