Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则2 getResult()需要很多时间_Php_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

Php 原则2 getResult()需要很多时间

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

我使用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', $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年后,你的解决方案仍然相关!