哪个更快更好用 - 查询db或迭代数组以查找元素总和

时间:2013-08-12 06:50:13

标签: symfony doctrine

我正在使用Symfony 2.2和Doctrine。我有实体产品,有一个价格领域。在我的控制器中,我需要获得一些产品。所以我有这样的事情:

$products = $this->productRepository->findNeededProducts(some criteria for the products);

然后我需要找到所有所需产品的价格总和。

哪个更好,更快 - 做这样的事情:

$sum = 0;
foreach ($products as $p) {
    $sum += $p->getPrice();
}

或者写一个像这样的新查询方法:

public function findSumofProcucts(same criteria here)
{
    $q = $this->createQueryBuilder('p')
        ->add('select', 'SUM(p.price)')
        ->where('p.user = :user') //for example  
        ->setParameter('user', $user)
        ->getQuery();

    return $q->getSingleScalarResult();

}

如果我写了查询,那么两个查询 - 获取所需产品和找到它们的总和将几乎完全相同,总和将有->add('select', 'SUM(p.price)')并且将返回SingleScalarResult而不是这个重复?所以我无法确定哪个更好。

如果你告诉我最佳做法是什么,我将非常感激。非常感谢你提前! :)

1 个答案:

答案 0 :(得分:3)

做第二种方法。出于同样的目的,数据库聚合查询的执行速度比PHP代码快得多。你必须想到以下的头脑 我假设你只需要总和,而不是其余的行

执行时间

您的数据库软件在聚合查询方面比PHP更好。一旦收到数据计算总和,PHP就必须迭代每个实例。如果可能的话,最好在数据库中执行此操作,因为它始终处理数据并具有优化的功能来执行此类操作。

数据传输

如果您只需要总和,那么您将发送一些行,它们的列值并不是您真正需要的。总而言之,您只需转移一个号码。如果行集很大,那么传输会产生很大的开销,并且传输数据的时间可能比计算总和还要长

条件

->where('p.user = :user') //例如 对于where查询,您还需要在条件匹配时检入PHP。额外开销。如果需要检查外键关系,例如where p.category in (SELECT category_id FROM user_categories as uc WHERE p.user=uc.user)。这将要求您迭代地从数据库中获取每个用户的类别以进行总和。使程序逻辑复杂化

关注点分离

当您可以将数据完全外包给数据库时,数据责任也在于PHP

这不适用:如果您要显示每一行和总和,那么计算相同而不是拍摄另一个查询更为明智