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

时间:2013-11-29 10:42:47

标签: php symfony doctrine-orm

我在网站主页上的第一个字节(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();

我一直在使用doccine2结果查询与memcached,但它似乎没有帮助。实际上查询数据库只需要大约50毫秒,这没什么。这是完整的分析信息(如果你在这里看不到它是full image):

enter image description here

如果我注释掉$query->getResult();,那么它会下降到大约300-400毫秒。知道为什么吗?

1 个答案:

答案 0 :(得分:4)

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

3500个物体的物体水化很慢:)

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