我在一个数据库中有两个表,这些表被倒空并经常替换。每个桌子的行远超过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查询的一些引用可以在此处,此处和此处找到
希望此帮助