我必须使用先前格式化的txt文件更新500000行,以获得正确的数据。格式化后,我将其推送到数组名$parts并循环通过它来开始更新行,但过程似乎很慢。有没有更快的方法来执行相同的任务?mysql表上的列必须是特殊键吗?
foreach($parts as $part){
\Log::channel('bulk_update_log')->info($part['part_number']);
DB::table('products')
->where('part_number', $part['part_number'])
->update(
[
'product_name' => $part['part_name'],
'price' => $part['part_price'],
]
);
}
2条答案
按热度按时间p8h8hvxi1#
我认为您将无法大幅缩短导入500k行所需的时间。但是,为了使它更可靠,因为您使用LaaFLE,您可以考虑创建一个将执行每行更新的作业,因此您处理您的500 K行,将每一行数据分配给作业,然后运行队列工作人员(甚至本地)来处理每一行。它不会更快,但确保每一行数据都得到处理,并且可以看到失败的作业,从而确保每个作业都运行,这将更加可靠。
https://laravel.com/docs/8.x/queues#creating-工作
dgjrabp22#
以下是一些可以加快更新速度的方法。
更新时,表记录只是用新数据重写。所有这些都必须在插入时再次执行。这就是为什么您应该始终使用insert。。。在重复密钥更新而不是替换时。
前者是密钥冲突时的更新操作,后者是删除/插入操作
下面是一个例子,在重复键更新c=c+1时,将值(1,2,3)插入表(a,b,c);更多关于这个。
更新1:最好在一个查询中完成所有插入操作。这将加快您的更新速度。看看这里如何做到这一点。
更新2:现在我有机会阅读你的其他子问题。这是我所知道的-
不要在循环中,而是尝试在一个sql和一个commit中执行所有更新。我不确定这会有什么不同。sql查询更为重要。这是你可以尝试的东西。对其进行基准测试。这种情况取决于表的大小&您拥有的索引,加上innodb或myisam。对此一无所知。请参阅第一点。是的,这可能会稍微加快你的速度。还可以查看是否已打开慢速查询日志。这会将所有慢速查询记录到单独的日志文件中。把这个也关掉。再一次。请参阅第一点。