我使用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秒。 :(为什么?我可以加快速度吗?
答案 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个)。