0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI要約
  • chunkメソッドは、データをオフセットとリミットで分割して処理する
  • chunkByIdメソッドは、主キー(ID)を基準にデータを分割して処理する
  • chunkメソッドは、データの追加や削除でオフセットがずれるリスクがある
  • chunkByIdメソッドは、主キーにより安定したチャンク処理が可能
  • 動的データにはchunkById、静的データにはchunkメソッドを使用すると良い

はじめに

以前chunkメソッドに関する記事を書きました

しかしchunkメソッドを使用するとデータ更新の際に予期しないことが起きてしまうので
その対策としてchunkByIdメソッドがあります
それぞれの違いを見ていきたいと思います

chunkByIdメソッドとは

主キーを使用してデータをチャンク(塊)に分割し、各チャンクを順次処理します
チャンクの境界を主キーで管理するため、データの追加や削除による影響を受けにくくなります

使用例

User::chunkById(100, function ($users) {
  foreach ($users as $user) {
    // ユーザーに関する処理
  }
});

メリット

  • 主キーでチャンクを分割するため、データの追加や削除の影響を受けにくい
  • パフォーマンスが安定する

デメリット

  • 主キーが存在しない場合や、主キーが連続していない場合に適用しにくい

使い分けのポイント

  • 動的データ
    • データが頻繁に変更される場合は、chunkByIdを使用する方が安全です
    • 主キーを使用しているため、データの追加や削除の影響を受けにくくなります
      • 取得の際はIDを参照するため(詳しくは後述)
  • 静的データ
    • データがほとんど変更されない場合や、データの変更が処理に影響を与えない場合は、chunkメソッドでも問題ありません

主キーを使った分割の具体例

chunkメソッドの動作と問題点

chunkメソッドはデータをオフセットとリミットで分割します
例えば、データが1000件ある場合、以下のようにクエリが実行されます

最初のチャンク

SELECT * FROM users LIMIT 100 OFFSET 0
chunkメソッドの問題点

データの削除や追加があるとオフセットがずれてしまいます

1件のデータを削除

DELETE FROM users WHERE id = 50;

次のチャンク

SELECT * FROM users LIMIT 100 OFFSET 100;

結果としてID50が削除されているためID101から200までのユーザーを取得するはずが、
実際にはID102からユーザーが取得されることになり、レコードが重複されたり、一部が抜け落ちたりする可能性があります

chunkByIdメソッドの動作

chunkByIdメソッドは、主キー(ID)を基準にしてデータを分割します

最初のチャンク

SELECT * FROM users WHERE id > 0 ORDER BY id ASC LIMIT 100;

次のチャンク

SELECT * FROM users WHERE id > 100 ORDER BY id ASC LIMIT 100;

chunkByIdメソッドでデータを削除

最初のチャンク

SELECT * FROM users WHERE id > 0 ORDER BY id ASC LIMIT 100;

結果:ID 1から100のユーザーを取得

レコード削除

DELETE FROM users WHERE id = 50;

次のチャンク

SELECT * FROM users WHERE id > 100 ORDER BY id ASC LIMIT 100;

結果:ID 101から200のユーザーを取得

この場合、ID50のレコードは削除されるため、取得されるデータに影響はありません

まとめ

chunkメソッドは、データをオフセットとリミットで分割するため、
データの追加・削除があるとオフセットがずれて、重複や抜け落ちが発生する可能性があります
chunkByIdメソッドが主キーを基準にデータを分割するため、データの追加・削除の影響を受けにくく、安定したチャンク処理が可能です
また、静的にデータを扱うならchunkメソッド、動的にデータを扱うならchunkByIdメソッドを記述して明示的にその処理の意味を与えると保守性の改善にも繋がりそうですね

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?