Php Symfony3 foreach导致本地服务器崩溃
我在一个数据库中有两个表,它们经常被清空和替换。每个表都有超过65000行。我想从第一个表(LnsPriceUpdates)中选择两个字段,然后将这些值进行比较并插入第二个表(LnsCatalog),然后对数据库中的所有65000项执行此操作 (注意:我想从本地主机执行所有这些操作) 以下是我正在使用的当前代码: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();
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