Symfony3 foreach导致本地服务器崩溃



我在一个数据库中有两个表,这些表被倒空并经常替换。每个桌子的行远超过65,000行。我想从第一个表( lnspriceupdates (中选择两个字段,然后取这些值,然后将它们比较并插入第二个表( lnscatalog (,并想对此进行此操作。数据库中的所有65,000个项目。

(注意:我想从Localhost完成所有这些(

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

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查询的一些引用可以在此处,此处和此处找到

希望此帮助

最新更新