Как оптимизировать производительность подсчета в symfony doctrine (mysql)? - PullRequest
0 голосов
/ 03 августа 2020

Я использовал следующий запрос для подсчета строк (~ 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()? . Пожалуйста, помогите мне, спасибо.

1 Ответ

0 голосов
/ 03 августа 2020

Как упоминает Акина в своем комментарии, вы можете упростить этот запрос, удалив все левое соединение, порядок по и даже отдельные.

Ваш запрос будет выглядеть примерно так:

SELECT COUNT(u0_.id) AS sclr_0 
FROM user u0_ 
WHERE u0_.type <> 'PARTNER'
AND u0_.is_delete = 0;

И да, вы должны использовать getSingleScalarResult () в своем Doctrine экземпляре запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...