大量にデータを更新かけたい時、配列でデータを取ってきてループで1件1件更新してしまうと、かなりの実行時間がかかってしまいます。あらかじめ定数を定義して、まとめて更新をかけることで処理速度が速くなります。

初期化処理にすごい時間がかかっていて、「いや、、これはまずい。。」と思ってソースを見てみたらこんな感じに書かれてました。


// フォームからデータ取得
$user_id = $form['user_id'];
// 更新対象データ取得
$arr_data = User::deletedFlgEqual(config('const.flg_off'))->userIdEqual($user_id)->get();
// 更新処理
if(isset($arr_data)){
    foreach ($arr_data as $user_data) {
        $user_data->fill([
            'hoge' => 0,
            'foo' => 2,
            'test' => 0,
            'testtest' => 0,
            'sample' => 0,
            'samplesample' => null,
            'updated_at' => date('Y/m/d H:i:s'),
            'delete_flg' => 0,
        ])->save();
    }
}

レコードの数だけ更新処理が走ってますね。

これだと、初期化処理など大量レコードに更新かける場合パフォーマンス最悪です。

修正後のソースです。


// フォームからデータ取得
$user_id = $form['user_id'];
// 更新データ定義
$arr_data = [
    'hoge' => 0,
    'foo' => 2,
    'test' => 0,
    'testtest' => 0,
    'sample' => 0,
    'samplesample' => null,
    'updated_at' => date('Y/m/d H:i:s'),
    'delete_flg' => 0,
];
// 更新処理
DB:table('user')->userIdEqual($user_id)->update($arr_data);

決められた定数にまとめて更新をかける場合は、最初に更新データを定義して対象に対して1回だけUpdate文を走らせるようにしたほうが速くなります。

ついでに初期化処理でよく使う、delete/insertのサンプルソースも記載します。


// 物理削除
MstUser::where('user_id', $form['user_id'])->delete();
// インサート処理
$insert_array = array();
if (isset($form['new_user_id'])) {
    foreach ($form['new_user_id'] as $new_id) {
        $array = array(
            'user_id' => $new_id,
            'hoge' => $form['hoge']
        );
        $insert_array[] = $array;
    }
    MstUser::insert($insert_array);
}
スポンサードサーチ