我有一个包含1000000条记录的mysql数据库表。我想更新每一行中的一列。
我试过:
public function methodWorking()
{
$properties = Property::with('requests')->get();
foreach ($properties as $property) {
$property->number_of_request = count($property->requests);
$property->save();
}
}
这个是有效的,但是在性能方面它非常糟糕。
我想写一个这样的代码:
public function methodExpect()
{
$properties = Property::with('requests')->get();
$property_array = [];
foreach ($properties as $property) {
$property->number_of_request = count($property->requests);
$property_array[] = $property;
}
Property::save($property_array);
}
是否可以使用laravel?
感谢。
答案 0 :(得分:1)
据我所知,没有办法在MySQL的一个查询中进行批量更新。您可以在循环中使用某些内容,例如将Property::save($property_array);
放入foreach
。
有关详细信息,请参阅this
答案 1 :(得分:0)
更改所有(或大多数)行通常表示架构设计较差。您想告诉我们该列包含哪些内容以及为什么需要进行大规模更改?
考虑从表中删除该列 - 然后以其他方式提供该值。
是的,一百万行表的UPDATE
需要很长时间。这是因为每行的旧副本都会保留,以防万一需要ROLLBACK
。
要对表格进行分块,以可管理的方式进行操作,请参阅http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
答案 2 :(得分:0)
您可以使用LaravelBatch,它非常有帮助(在10000条记录中进行了测试)