在Laravel中高效的批量数据插入(25万条记录)而不超过PHP时间限制? (队列、多租户)

问题描述 投票:0回答:1

我在使用 Laravel Eloquent 将大约 250k 条记录插入 MySQL 数据库时遇到 PHP 执行时间错误。考虑到以下限制,我的目标是在不增加总体执行时间的情况下实现这一目标:

  1. 前端:角度
  2. 多租户:使用实现 https://tenancyforlaravel.com/
  3. 尝试的解决方案:Laravel Queue

下面是我的代码。

作业文件代码 -

class MedicineData implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable;

    public $data;

    public function __construct($data)
    {
        $this->data = $data;

    }

    public function handle(): void
    {
        foreach ($this->data as $key => $value) {
            $medicine = new MedicineName();
            $medicine->name = $value['name'];
            $medicine->save();
        }
    }

}

控制器文件代码

$chunks = array_chunk($data, 500);
$batch = Bus::batch([])->dispatch();

foreach ($chunks as $key => $value) {
    $batch->add(new MedicineData($value));
}

我收到最大 PHP 执行时间错误。怎么解决这个问题。

php laravel database performance eloquent
1个回答
0
投票

就您而言,使用 Laravel 队列是朝着正确方向迈出的一步,但您可能需要调整您的方法以使其更加高效。您需要对队列逻辑进行一些优化:

public function handle(): void
{
    $dataToInsert = [];
    foreach ($this->data as $value) {
        $dataToInsert[] = [
            'name' => $value['name'],
            // other attributes...
        ];
    }
    // use insert method to bulk inserting
    MedicineName::insert($dataToInsert);

    // If your $this->data already formated array than no need to run loop for formating
    // use direct insert on Model
    // MedicineName::insert($this->data);
}

insert 方法更适合批量插入,可以通过一次查询将多条记录插入数据库。

© www.soinside.com 2019 - 2024. All rights reserved.