3

我需要手动将大量订单项保存到数据库中。我目前正在做这样的事情:

for($x=0; $x<250000; $x++)
{
    $orderItem = Mage::getModel('sales/order_item');
    $data = array('a'=>1, 'b'=>2, 'c'=>3);  
    $orderItem->setData($data)->save();
}

尝试从 shell 脚本运行此代码需要很长时间。我可以使用哪些策略来加速此代码?

4

2 回答 2

5

我不确定,但看看@Mage::getModel('core/resource_transaction')

https://stackoverflow.com/a/4879133/1191288

您可以尝试批量保存 X 数量

 $batch = 500;
 $orderItem = Mage::getModel('sales/order_item');
 $transactionSave = Mage::getModel('core/resource_transaction');

 for($x=0; $x<250000; $x++){
     $orderItem->setData( array('a'=>1, 'b'=>2, 'c'=>3));
     $transactionSave->addObject($orderItem);
     $orderItem->reset()
     if ($x % $batch == 0){
        $transactionSave->save();
        $transactionSave = null;
        $transactionSave = Mage::getModel('core/resource_transaction');
     }
 }

 if($x % $batch > 0)
   $transactionSave->save();
于 2013-01-04T22:54:45.283 回答
3

我认为在这种情况下,显着加快速度的最佳选择是创建自定义数据库查询。

编辑:相关选项:尝试重写模型和资源模型以实现一个方法 bulkSave() ,它类似于 save() 但只创建相应的查询对象并返回它,因此它实际上并不使用数据库。然后收集所有查询并在每千项左右的大事务中运行它们。

于 2013-01-04T22:18:54.067 回答