Php 原则2 getResult()需要很多时间
我使用doctrine 2开发symfony 2应用程序。我的代码是:Php 原则2 getResult()需要很多时间,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我使用doctrine 2开发symfony 2应用程序。我的代码是: $userSites = $this->getDoctrine()->getManager() ->createQuery('SELECT us, s FROM MyMainBundle:UserSite us JOIN us.site s WHERE us.user = :user_id') ->setParameter('user_id', $use
$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)时,需要0008秒。但是getResult()大约需要20-30秒:(为什么?我可以加快速度吗?原则比只使用
mysql\u query()
要慢一点也不奇怪,但是7000个结果的20-30秒远比我预期的要多。也许你可以分析你的应用程序,例如使用xhprof,看看哪个部分消耗了不寻常的内存/时间
正如@vsmoraes在评论中指出的那样,您可以将FETCH_模式切换到array。您还可以缓存查询/结果,或者进行分页(只获取部分结果,例如每页100个).您确定phpmyadmin会无限制地执行查询吗?默认情况下,它会添加限制0、30或类似的内容,并进行分页。我想说,如果您在本地计算机、共享主机服务器或VPS上工作,20-30秒是正常的,它的加载速度应该快几倍,因为它们使用缓存,如apc 在现实世界中,你永远不应该做一个会返回那么多结果的查询。你应该研究一下批处理原则。这就是我使用的方法,而且效果很好。基本上,你会在一个循环中进行更多“更小”的查询。如果你需要一个如何实现这一点的示例,我可以给你一个代码示例
而且,当您进行复杂的查询并且时间很重要时,请尝试使用DBAL(数据库抽象层),以避免使用复杂的对象进行查询。我遇到了这个问题,但在原则1中。我已经解决了将水合模式从对象切换到数组的问题。我认为您也可以在原则2中执行此操作。尝试以下操作:
$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(Doctrine\ORM\Query::hydrome_ARRAY);
I将getResult()更改为getArrayResult().现在大约需要5秒。但我认为它仍然太长了…你能发布由条令生成的查询,以便我们检查它与原始查询之间的差异吗?你是否可能在实体内部执行cpu繁重的操作?@vsmoraes即使5年后,你的解决方案仍然相关!