gpt4 book ai didi

orm - Doctrine2 fetch Count 更优化更快的方式或 Zf2 库

转载 作者:行者123 更新时间:2023-12-04 00:08:32 28 4
gpt4 key购买 nike

我正在使用 Doctrine2 和 Zf2 ,现在当我需要获取 count 行时,我有以下两种方法来获取它。但我担心的是哪种方式会更优化和更快,因为将来行数将超过 50k。任何建议或任何其他方法来获取计数?是否有任何函数可以用于 findBy ???

或者我应该使用普通的 Zf2 数据库库来获取计数。我刚刚发现当数据很大时,ORM 不适合获取结果。请任何帮助将不胜感激

$members = $this->getEntityManager()->getRepository('User\Entity\Members')->findBy(array('id' => $id, 'status' => '1'));
$membersCnt = sizeof($members);

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('count(p)')
->from('User\Entity\Members', 'p')
->where('p.id = '.$id)
->andWhere('p.status = 1');

$membersCnt = $qb->getQuery()->getSingleScalarResult();

最佳答案

比较

1) 您的 EntityRepository::findBy() 方法将执行此操作:

  • 在数据库中查询符合条件的行。数据库将返回完整的行。
  • 然后将数据库结果转换(水合)成完整的 PHP 对象(实体)。

2) 您的 EntityManager::createQueryBuilder() 方法将执行此操作:

  • 在数据库中查询符合您条件的行数。数据库将返回一个简单的数字(实际上是一个代表数字的字符串)。
  • 然后将数据库结果从字符串转换为 PHP 整数。

您可以放心地得出结论,选项 2 比选项 1 更有效:

  • 数据库可以优化查询以进行计数,这可能使查询更快(花费更少的时间)。
  • 从数据库返回的数据要少得多。
  • 没有实体被水合(只有一个简单的字符串转换为整数)。

总而言之,将使用更少的处理能力和更少的内存。

安全评论

从不将值连接到查询中!这会使您容易受到 SQL injection 的攻击当这些值(源自)用户输入时进行攻击。

此外,Doctrine2 不能使用准备好的语句/参数绑定(bind),当经常使用相同的查询(有或没有不同的参数)时,这可能会导致一些性能损失。

换句话说,替换这个:

->where('p.id = '.$id)
->andWhere('p.status = 1')

用这个:

->where('p.id = :id')
->andWhere('p.status = :status')
->setParameters(array('id' => $id, 'status' => 1))

或:

->where($qb->expr()->andX(
$qb->expr()->eq('p.id', ':id'),
$qb->expr()->eq('p.status', ':status')
)
->setParameters(array('id' => $id, 'status' => 1))

另外

对于这个特定的查询,不需要使用 QueryBuilder,你可以直接使用 DQL:

$dql = 'SELECT COUNT(p) FROM User\Entity\Members p WHERE p.id = :id AND p.status = :status';
$q = $this->getEntityManager()->createQuery($dql);
$q->setParameters(array('id' => $id, 'status' => 1));

$membersCnt = $q->getSingleScalarResult();

关于orm - Doctrine2 fetch Count 更优化更快的方式或 Zf2 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com