Я использовал следующий запрос для подсчета строк (~ 1M запись и оставшееся соединение многих таблиц):
SELECT COUNT(DISTINCT u0_.id) AS sclr_0
FROM user u0_
LEFT JOIN user_detail u1_ ON u0_.id = u1_.user_id
LEFT JOIN recruitment_info r2_ ON u0_.id = r2_.user_id
LEFT JOIN user u3_ ON u0_.master_account_id = u3_.id
LEFT JOIN applicants_partners a4_ ON u0_.id = a4_.applicant_id
LEFT JOIN partner p5_ ON a4_.partner_id = p5_.id
WHERE u0_.type <> 'PARTNER'
AND u0_.is_delete = 0
ORDER BY u0_.id DESC;
В моем symfony я получил общее: $total = $queryBuilder->getQuery()->getSingleScalarResult();
Это сработало, но потребовалось ~ 2,5 с.
Итак, я хотел бы улучшить его производительность. Я изменил его на:
SELECT COUNT(u0_.id) AS sclr_0
FROM user u0_
LEFT JOIN user_detail u1_ ON u0_.id = u1_.user_id
LEFT JOIN recruitment_info r2_ ON u0_.id = r2_.user_id
LEFT JOIN user u3_ ON u0_.master_account_id = u3_.id
LEFT JOIN applicants_partners a4_ ON u0_.id = a4_.applicant_id
LEFT JOIN partner p5_ ON a4_.partner_id = p5_.id
WHERE u0_.type <> 'PARTNER'
AND u0_.is_delete = 0
GROUP BY u0_.id
ORDER BY u0_.id DESC;
Здесь изменение - удалить DISTINCT
и добавить GROUP BY
. Затем я применяю symfony по результату массива count:
$result = $queryBuilder->getQuery()->getArrayResult();
$total = count($result);
Итак, сумма верна, но на этот раз потребовалось ~ 20 секунд, OMG. Когда я попытался запустить только необработанный запрос в инструменте Sequel Pro, это заняло всего ~ 40 мс. Может проблема в getArrayResult()
? . Пожалуйста, помогите мне, спасибо.