isqad
isqad88
Здравствуйте!
Существуют две таблицы: tenders и organizations. У конкурсов (tenders) есть участники (берутся из organizations (далее компаний)), подрядчики (тоже из компаний), заказчики (из компаний), победитель (компания). Связи между участниками и конкурсами при этом - многие ко многим, подрядчиками и конкурсами - многие к одному (так же и с заказчиками и победителем). Соответственно, получается большой запрос с join если необходимо выбрать конкурсы со всеми сразу:
При этом, должна быть еще постраничная навигация (добавляются LIMIT и OFFSET)
Понятно, что стоит этот запрос разбить хотя бы на 2 запроса, так как запрос выше выполняется ну очень медленно, но как это сделать с LIMIT и OFFSET?
Индексы расставлены на полях, по которым происходит чаще всего сортировка и выборка с условием.
Вот запрос из реального приложения, как видите, куча join-ов, по-другому никак, и этот запрос тормозит:
В догонку вот еще вопрос: получится ли повысить производительность запроса, если часть связующих таблиц поместить в redis?
Существуют две таблицы: tenders и organizations. У конкурсов (tenders) есть участники (берутся из organizations (далее компаний)), подрядчики (тоже из компаний), заказчики (из компаний), победитель (компания). Связи между участниками и конкурсами при этом - многие ко многим, подрядчиками и конкурсами - многие к одному (так же и с заказчиками и победителем). Соответственно, получается большой запрос с join если необходимо выбрать конкурсы со всеми сразу:
PHP:
SELECT t, customers, contractors, party, winner FROM tenders t LEFT JOIN t.organizations customers LEFT JOIN t.contractors contractors LEFT JOIN t.party party LEFT JOIN t.winner winner ... (в настоящем проекте еще 3-5 join-ов)
Понятно, что стоит этот запрос разбить хотя бы на 2 запроса, так как запрос выше выполняется ну очень медленно, но как это сделать с LIMIT и OFFSET?
Индексы расставлены на полях, по которым происходит чаще всего сортировка и выборка с условием.
Вот запрос из реального приложения, как видите, куча join-ов, по-другому никак, и этот запрос тормозит:
PHP:
SELECT t, o, p, c, w, m, f, parent, cparent, com, party FROM PortalTenderBundle:Tender t
LEFT JOIN t.organization o
LEFT JOIN o.parent parent
LEFT JOIN t.provision p
LEFT JOIN t.contractors c
LEFT JOIN c.parent cparent
LEFT JOIN t.contractors cf
LEFT JOIN t.winner w
LEFT JOIN t.manager m
LEFT JOIN t.files f
LEFT JOIN t.comments com
LEFT JOIN t.party party
LEFT JOIN t.party party_f
WHERE ((t.opening_at IS NULL) OR (t.opening_at IS NOT NULL AND t.opening_at <= CURRENT_TIMESTAMP()))