Задать вопрос
@vadikrudnov

Почему метод chunk при большом количестве данных отдает только половину?

Всем привет!

До этого использовал метод chunk на маленьком количестве данных, до 5К данных, и метод работал отлично.
Model::chunk(1000, function($models){
   foreach($models as $model){
      $model->text = null;
      $model->save();
   }
});

Тут решил опробовать на 40К данных и в итоге этот метод смог обработать только 20К, и главное не ошибок, ничего не вылезло.
Почему метод chunk при большом количестве данных отдает только половину? И нигде не встречал такой информации, что данный метод обрабатывает только половину данных.
  • Вопрос задан
  • 545 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@vadikrudnov Автор вопроса
Сам задал, сам нашел ответ:

Представьте, что вы используете метод 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!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
pLavrenov
@pLavrenov
Разработка сайтов
Дело вообще не в chunk, а во времени исполнения скрипта или оперативной памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы