LoginSignup
3
1

Laravelでchunkメソッドを使ってみよう!

Posted at
  • 大量のデータを取得
  • 取得した大量のデータを加工しないといけない

というような場合に役に立つメソッドがchunkです。

chunkメソッドでできることは

リファレンスこちら

大量のデータを小分けして取得することが可能です。

何万件ものデータを一括で取得すると、

  • Out of Memoryを起こす
  • レスポンスが遅くなる
  • パフォーマンスが低化する

恐れがあります。
こちらを回避できるメソッドです。

例)1万件のデータを取得するとき
chunkで一度に取得する件数を100件と設定すると
100件 × 100回 でデータを取得するようになります。

記述例

基本的な記法

DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    foreach ($users as $user) {
        // ここに処理を記述
    }
});

第1引数に1チャンクで扱うデータ数を決めます。
第2引数をクロージャとし、1チャンク内で行う処理を記述します。

条件を満たすもののみ取得する場合

$getProducts = collect();

$query->chunk(100, function ('users') use (&$getUsers) {

		// ライセンス条件を満たしたuserを取得する関数
		$result = $this->checkLicence($users);
		
		// このチャンク内で取得したものを格納
		$getUsers = $getUsers->merge($result);
});

このようにデータを取得すると、メモリを節約しパフォーマンスを低下させずに大量のデータを扱えるようになります。
ただし、一度に取得するデータ数の設定は多すぎても少なすぎてもパフォーマンスが低下する恐れがあります。
下記2点注意してお使いください。

一度に取得するデータ数の設定が多すぎる場合

  • そもそもchunkを使う意味がなくなってしまう

一度に取得するデータ数の設定少なすぎる場合

  • 1000件のデータに対してchunkの引数に1を設定した場合
    • 1件 × 1000回 になるのでDBへの負担が大きくなる
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1