Php Symfony3 foreach导致本地服务器崩溃

Php Symfony3 foreach导致本地服务器崩溃,php,symfony,foreach,doctrine-orm,doctrine,Php,Symfony,Foreach,Doctrine Orm,Doctrine,我在一个数据库中有两个表,它们经常被清空和替换。每个表都有超过65000行。我想从第一个表(LnsPriceUpdates)中选择两个字段,然后将这些值进行比较并插入第二个表(LnsCatalog),然后对数据库中的所有65000项执行此操作 (注意:我想从本地主机执行所有这些操作) 以下是我正在使用的当前代码: public function testbananaAction() { $em = $this->getDoctrine()->getManager();

我在一个数据库中有两个表,它们经常被清空和替换。每个表都有超过65000行。我想从第一个表(LnsPriceUpdates)中选择两个字段,然后将这些值进行比较并插入第二个表(LnsCatalog),然后对数据库中的所有65000项执行此操作

(注意:我想从本地主机执行所有这些操作)

以下是我正在使用的当前代码:

public function testbananaAction()
{

    $em = $this->getDoctrine()->getManager();
    $query = $em
        ->createQuery(
            'SELECT l.partnumber, l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL'
        )
        ->getResult();


    foreach ($query as $row){
        $partNo = $row['partnumber'];
        $part = $em->getRepository('AppBundle:Lnscatalog')
            ->findOneBy(['partnoid' => $partNo]);
        $dealerCost = $row['level1Net'];
        if(isset($dealerCost) && isset($part)){
            $partCheck = $part->getDealerCost();
            if(!isset($partCheck)){
                $part->setDealerCost($dealerCost);
                $em->flush();
            }
        } else {
            continue;
        }

    }
    return new Response('yay');

}

任何在不崩溃的情况下完成此任务的想法都会很有帮助。

您可以通过一次Sql更新实现以下目标:

update Lnscatalog c 
set c.dealerCost = (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
where c.dealerCost is null
and exists (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
通过在上表中添加一些索引,可以加快此查询的速度,例如:

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_1 (level1Net, partnumber) ;

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_2 (partnumber) ;

ALTER TABLE Lnscatalog 
 ADD INDEX Lnscatalog_IDX_2 (dealerCost) ;
可以找到一些关于优化sql查询的参考资料,以及


希望通过一次Sql更新可以实现以下帮助:

update Lnscatalog c 
set c.dealerCost = (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
where c.dealerCost is null
and exists (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
通过在上表中添加一些索引,可以加快此查询的速度,例如:

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_1 (level1Net, partnumber) ;

ALTER TABLE LnsPriceUpdates 
 ADD INDEX LnsPriceUpdates_IDX_2 (partnumber) ;

ALTER TABLE Lnscatalog 
 ADD INDEX Lnscatalog_IDX_2 (dealerCost) ;
可以找到一些关于优化sql查询的参考资料,以及


希望这有帮助

谢谢!看起来这会起作用,唯一的问题是它已经加载了30分钟。在where条件中添加一些sql索引。我从来没有使用过索引,你能为我解释一下吗?这确实加快了速度,但现在dealercost中的所有值都是1谢谢!看起来这会起作用,唯一的问题是它已经加载了30分钟。在where条件中添加一些sql索引。我从未使用过索引,你能为我解释一下吗?这确实加快了速度,但现在dealercost中的所有值都是1