Получу ли я лучшую производительность, если буду использовать запрос COUNT вместо циклического перебора сущностей в Symfony 4? - PullRequest
0 голосов
/ 21 февраля 2019

Например, мне нужно получить количество отзывов, один из способов сделать это выглядит так:

public function getActiveReviews()
{
    return $this->getReviews()->filter(function(Review $review) {
        return $review->isActive() && !$review->isDeleted();
    })->count();
}

Другой способ - использовать Query Builder следующим образом:

$qb = $this->createQueryBuilder('r')
      ->where('r.active = true')
      ->andWhere('r.deleted = false')
      ->select('count(r)')

Какойспособ даст мне лучшую производительность и почему?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это зависит от реализации подсчета Symphony (), но вы, вероятно, будете.Обычно СУБД подсчитывает свои строки быстрее внутри страны, и для этого требуется гораздо меньше ресурсов.

В первом случае вы запрашиваете целый набор строк, который может быть огромным, затем вы выполняете итерацию по нему, применяете свою функцию фильтра к каждой строке,а затем вы просто смотрите на размер отфильтрованного набора строк и все отбрасываете.(Но, конечно, это может быть как-то оптимизировано вашей средой).

Во втором случае вы просто спрашиваете базу данных, сколько строк в ней удовлетворяет критериям.И БД возвращает вам число, и это все.

Как говорили другие люди, единственный случай, когда первый выбор может быть более быстрым, - это когда вы уже кэшировали набор строк (не нужно подключаться к БД) - и когда вашСоединение с БД очень медленное в то же время.

Я видел базы данных, которые работали медленно на некоторых запросах COUNT (Oracle) для больших таблиц, но они все еще были быстрее, чем PHP-код на том же наборе строк.БД оптимизированы для фильтрации и подсчета данных.И обычно запрос COUNT выполняется очень быстро.

0 голосов
/ 21 февраля 2019

Конечно, запрос подсчета будет быстрее, потому что он приведет к одному запросу SQL, который вернет одно значение.

Для итерации по сущностям потребуется:

  1. Выполнение SQL-запроса для извлечения строк данных
  2. Фактическая выборка данных
  3. Создание и сохранение объектов сущностейизвлеченные в них данные

В зависимости от количества затронутых данных разница может быть очень большой.

Единственный случай, когда подсчет сущностей может быть достаточно быстрым, - это случай, когда у вас уже получены все сущности, и вам просто нужно их подсчитать.

...