Doctrine 2 getResult()需要花费很多时间

时间:2014-05-06 19:17:54

标签: php mysql symfony doctrine-orm

我使用doctrine 2处理symfony 2 app。我的代码是:

$userSites = $this->getDoctrine()->getManager()
            ->createQuery('SELECT us, s FROM MyMainBundle:UserSite us JOIN us.site s WHERE us.user = :user_id')
            ->setParameter('user_id', $user_id)
            ->getResult();

它通常返回大约7000多条记录。当我将此查询直接传递给mysql(使用getSql()并粘贴到phpmyadmin)时,它需要0,008s。但getResult()大约需要20-30秒。 :(为什么?我可以加快速度吗?

2 个答案:

答案 0 :(得分:3)

你确定phpmyadmin在没有LIMIT的情况下进行查询吗?默认情况下,它会添加LIMIT 0,30或类似的东西,然后进行分页。我会说20-30s是正常的,如果你在本地机器上工作,在共享托管服务器或VPS上它应该加载几倍,因为它们使用缓存,如apc。

你永远不应该在现实世界中进行会返回那么多结果的查询。你应该考虑批量学说。这就是我使用的东西,效果很好。基本上你会做更多"更小"循环查询。如果你需要一个例子,我可以给你代码示例。

而且,当您进行复杂查询并且时间很重要时,请尝试使用DBAL(数据库抽象层),以避免使用复杂对象进行查询。

答案 1 :(得分:2)

毫不奇怪,Doctrine比仅使用mysql_query()要慢,但对于7000的结果,20-30s比我预期的要多。也许你可以描述你的应用程序,例如使用xhprof查看哪个部分消耗了异常的内存/时间。

正如@vsmoraes在评论中指出的那样,您可以将FETCH_MODE切换到数组。您也可以缓存查询/结果或者分页(仅获取部分结果,例如每页100个)。