Php 在symfony2/doctrine中使用getResults查询3500条目速度较慢

Php 在symfony2/doctrine中使用getResults查询3500条目速度较慢,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在我的网站主页中,我的第一个字节(TTFB)的时间大约是1.8秒,这相当慢,因为我知道最佳实践应该是500毫秒。我一直在使用调试工具,而且似乎大部分时间都花在控制器上,特别是我有一个查询,可以查询3500个实体,这似乎不太重要。我一直在使用调试工具,并在prod版本中进行了测试,但在prod版本中仍然很慢。问题是: $qb = $em->createQueryBuilder(); $picturesQuery = $qb->select('DISTINCT p') -

在我的网站主页中,我的第一个字节(TTFB)的时间大约是1.8秒,这相当慢,因为我知道最佳实践应该是500毫秒。我一直在使用调试工具,而且似乎大部分时间都花在控制器上,特别是我有一个查询,可以查询3500个实体,这似乎不太重要。我一直在使用调试工具,并在prod版本中进行了测试,但在prod版本中仍然很慢。问题是:

$qb = $em->createQueryBuilder();
$picturesQuery = $qb->select('DISTINCT p')
        ->from("AppMainBundle:ShopPicture", 'p')
                    ->innerJoin('p.shop', 'shop')
                    ->addOrderBy('p.numberoflikes', 'DESC')
                    ;

            //if this is not admin, then do not show locked stores
            if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) {
                $picturesQuery->andWhere('shop.isLocked  = :isLocked')  
                              ->setParameter('isLocked', 0);

                $picturesQuery->andWhere('p.isLocked = :pictureLocked')
                              ->setParameter('pictureLocked', 0)
                              ;
            } 

            $query = $picturesQuery->getQuery();
            $query->useResultCache(true, 3600);
            $shopPictures = $query->getResult();
我一直在使用memcached的doctrine2结果查询,但似乎没有帮助。查询数据库实际上只需要大约50毫秒,这算不了什么。以下是完整的分析信息(如果您看不到,请参阅以下内容):


如果我注释掉
$query->getResult()然后下降到大约300-400毫秒。你知道为什么吗?

正如IRC上所解释的,你应该对$query进行分页,而不是$shopPictures

3500个对象的对象水合作用缓慢:)


编辑:适用于阅读评论的任何人。这里缺少的部分是分页的结果。现在编写的问题是,它获取所有结果,只显示其中的一小部分。

正如IRC上所解释的,应该为$query分页,而不是$shopPictures

3500个对象的对象水合作用缓慢:)


编辑:适用于阅读评论的任何人。这里缺少的部分是分页的结果。现在如何编写的问题是,它获取所有结果,只显示其中的一小部分。

您是否尝试在数据库上执行原始查询并查看其执行情况?注释
$query->getResult()
跳过记录的实际获取。此外,如果结果作为对象进行水合,水合作用可能会很慢,正如@Lumbendil指出的那样。尝试将结果作为数组进行水合,以查看获取结果的时间是否发生变化。是否尝试在数据库上执行原始查询并查看其执行情况?注释
$query->getResult()
跳过记录的实际获取。此外,如果结果作为对象进行水合,水合作用可能会很慢,正如@Lumbendil指出的那样。尝试将结果作为一个数组进行水合,以查看时间是否发生变化,以获得结果。