Laravel: MASSIVE updateOrCreate()

5 浏览
0 Comments

Laravel: MASSIVE updateOrCreate()

我正在尝试将一个古老的系统中的数据(每晚)导出到一个更容易编写代码的系统中;然而,导出的数据量非常庞大。

我将数据转储为JSON对象,然后尝试使用Laravel的updateOrCreate()方法进行更新或创建,但数据量太大了。通常需要大约10个小时来处理所有数据,生成250万个MySQL行。

我认为速度慢是因为实际上执行了500万次查询。

有没有人知道如何高效地执行大规模的updateOrCreate()操作的好例子,使用Laravel实现?

0
0 Comments

Laravel: MASSIVE updateOrCreate()问题的出现原因是在处理大量数据时,使用updateOrCreate()方法可能会导致性能下降。这是因为在使用updateOrCreate()方法时,每次都需要执行一次查询来验证数据是否已存在,然后再进行更新或插入操作。当数据量非常大时,这将导致大量的查询操作,从而影响性能。

为了解决这个问题,可以采用批量处理的方式来提高性能。具体的做法是首先从JSON中获取一定数量的数据记录,然后手动执行查询操作来验证数据是否存在。对于已存在的数据,使用update方法进行更新;对于不存在的数据,将其放入一个数组中,然后使用批量插入的方式来一次性插入这些数据记录。

下面是一个示例代码,展示了如何使用批量插入的方式来提高性能:

$records = [];
// 从JSON中获取500条数据记录
$data = json_decode($json, true);
foreach ($data as $item) {
    // 验证数据是否存在
    $existingData = DB::table('your_table')->where('id', $item['id'])->first();
    if ($existingData) {
        // 数据已存在,执行更新操作
        DB::table('your_table')->where('id', $item['id'])->update($item);
    } else {
        // 数据不存在,将其放入数组中
        $records[] = $item;
    }
}
// 批量插入数据
DB::table('your_table')->insert($records);

需要注意的是,为了提高性能,应尽量控制批量插入的数据量,避免数据量过大或过小。此外,批量插入的效果还取决于具体的数据和插入算法。

使用批量插入的方式可以显著提高性能。但是需要注意的是,在执行更新操作之前,最好先检查数据是否发生了变化。通过执行选择查询来判断数据是否发生变化,可以避免执行不必要的更新操作,因为选择查询的开销要比更新操作小得多。

0
0 Comments

Laravel: MASSIVE updateOrCreate()这个问题的出现的原因是数据插入的效率较低,可能会重复插入相同的数据。为了解决这个问题,可以将数据划分为小块进行插入,并尽量避免重复插入相同的数据。

解决方法是将数据划分为小块,并使用循环逐个插入数据。可以使用array_chunk()函数将数据划分为指定大小的块,然后使用嵌套的foreach循环逐个插入每个记录。代码示例如下:

$dataChunks = array_chunk($data, 10000);
foreach($dataChunks as $dataChunk){
   foreach($dataChunk as $record){
       DB::table('your_table')->insert($record);
   }
}

根据数据的大小,可以调整每个数据块的大小。这样可以提高数据插入的效率,并减少重复插入相同数据的情况。

0