どのようにインポート速度を向上させるチャンキングを使用します.

5666 ワード


イントロ
昨日、データベースに挿入する前にレコードをチャンクすることについて話しました.今日はどのように動作し、速度の違いは何かを示したい.

TLR
常に3 x速度を得るためにデータベースに挿入する前にあなたのレコードをチャンクします.

コンソールコマンド
このコンソールコードでは、各モデルを反復処理して、Githubから最新のコレクションを取得し、それを注入しようとします.
public function handle(): int
{
    //...
    foreach ($this->models as $model) {
        $record = $service->factory($model);
        $injectStation->inject($record, $model);
    }
    //...
}

注入ステーション
注入ステーションでは、レコードをチャンクして500にし、データベースに挿入します.
public function inject(?Collection $records, string $modelName): void
{
    $tableName = (new $modelName)->getTable();

    DB::table($tableName)->truncate();

    $chunks = $records->chunk(500);

    foreach ($chunks as $chunk) {
        DB::table($tableName)->insert($chunk->toArray());
    }
}
輸入速度は約8秒、70 Kレコードのクールな速度です.


もし何か
だから、科学のために.我々は、チャンキングを削除し、それを1つずつ挿入します.(コードの数が少ない場合に注意してください).
public function inject(?Collection $records, string $modelName): void
{
    $tableName = (new $modelName)->getTable();

    DB::table($tableName)->truncate();

    foreach ($records as $record) {
        DB::table($tableName)->insert($record);
    }
}
輸入速度は、28秒に、3倍の速度は、チャンクドバージョンと比較して低下!


物語の教訓
データベースに大量のデータを挿入する場合は、それをチャンクすることを忘れないでください!