Сам задал, сам нашел ответ:
Представьте, что вы используете метод
chunk для удаления всех записей. В таблице 2 000 000 записей, и вы собираетесь удалить их все по 1000 фрагментов.
Model::orderBy('id')->chunk(1000, function ($models) {
foreach($models as $model) {
$model->delete();
}
});
Он удалит первые 1000 записей, получив первые 1000 записей в запросе, подобном этому:
SELECT * FROM table ORDER BY id LIMIT 0,1000
И затем другой запрос из метода chunk:
SELECT * FROM table ORDER BY id LIMIT 1000,2000
Проблема здесь в том, что мы удаляем 1000 записей, а затем получаем результаты от 1000 до 2000. На самом деле нам не хватает первых 1000 записей, и это означает, что мы не удалим 1000 записей на первом шаге chunk! Этот сценарий будет таким же для других шагов. На каждом этапе мы будем пропускать 1000 записей, и это является причиной того, что мы не получаем наилучшего результата в таких ситуациях.
Приведен пример для удаления, потому что таким образом это показывает точное поведение метода chunk.
Если Вам не нужны пропуски данных, используйте метод
chunkById!