我需要手动将大量订单项保存到数据库中。我目前正在做这样的事情:
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 脚本运行此代码需要很长时间。我可以使用哪些策略来加速此代码?
我需要手动将大量订单项保存到数据库中。我目前正在做这样的事情:
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 脚本运行此代码需要很长时间。我可以使用哪些策略来加速此代码?
我不确定,但看看@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();
我认为在这种情况下,显着加快速度的最佳选择是创建自定义数据库查询。
编辑:相关选项:尝试重写模型和资源模型以实现一个方法 bulkSave() ,它类似于 save() 但只创建相应的查询对象并返回它,因此它实际上并不使用数据库。然后收集所有查询并在每千项左右的大事务中运行它们。