Вставка большого количества записей в базу данных с использованием метода Laravel Chunk со временем становится медленнее

Итак, в основном я пытаюсь импортировать данные примерно в 15 разных таблиц в свою базу данных из другой. Я фрагментирую данные из исходной базы данных и в рамках этого обратного вызова функции вставляю их в свою базу данных, используя необработанный SQL. Пример кода:

foreach($tables as $table) {    
     DB::connection('source_db')->table($table)->select($fields)->orderBy('id'))->chunk(2500, function($records) use($table) {
          $this->runInsertQuery($records, $table);
     });
}

Всего около 2 миллионов записей, кажется, что он начинается очень быстро, но становится все медленнее и медленнее по мере того, как он перемещается от таблицы к таблице, что занимает несколько часов. На основе документации Laravel у меня сложилось впечатление, что разбиение на фрагменты заставит вставки работать намного быстрее, но, похоже, имеет противоположный эффект. Будем признательны за любые рекомендации!

Для этого воспользуйтесь инструментом mysqldump.

Kyslik 06.06.2018 21:36

«разбивка на фрагменты заставит вставки работать намного быстрее», чем при отсутствии фрагментов, а не просто «быстрее и быстрее с течением времени».

Sammitch 06.06.2018 21:38

Но мой вопрос в том, что заставляет его двигаться все медленнее и медленнее с течением времени, и что я могу сделать, чтобы предотвратить это?

Matthew Hirt 06.06.2018 21:40

Вы отслеживали использование памяти приложениями? Я мог себе представить, что со временем скрипт использует почти всю доступную память, что требует от сборщика мусора правильного выполнения своей работы. С меньшими скриптами вы часто даже не видите работающего сборщика мусора, потому что скрипт завершается до того, как у вас закончится память. Так что, может быть, попробуйте использовать больше памяти и следить за своей памятью. Вы также можете попробовать добавить gc_collect_cycles() (принудительная сборка мусора) в конце или после того, как каждый фрагмент что-то меняет.

Namoshek 06.06.2018 22:01
Также есть хорошая статья о gc и о том, как решить с ним возможные проблемы. Между прочим, у меня были аналогичные проблемы с пакетом laravel / scout при импорте большого количества строк, также вполне вероятно из-за метода chunk. Так что я, возможно, тоже смогу исследовать это сам.
Namoshek 06.06.2018 22:06

Вы должны изолировать снижение производительности. Это часть чтения и разбивки на части? Или это часть процесса вставки? Вы можете попробовать заменить $this->runInsertQuery($records, $table) функцией, которая ничего не делает, и посмотреть, будет ли у вас по-прежнему замедление. Если вы это сделаете, попробуйте увеличить ваши куски. Причина возможного замедления? Чтение фрагмента занимает время, пропорциональное тому, сколько фрагментов уже было прочитано. ... LIMIT 2500 OFFSET 25000000 может быть довольно медленным.

O. Jones 06.06.2018 23:09

@ O.Jones, вы правы, чтение фрагментов занимает все больше времени для каждого фрагмента, что, кажется, является источником замедления. Спасибо за вашу помощь!

Matthew Hirt 11.06.2018 15:58

Можете ли вы показать определение таблицы, которую вы читаете? (SHOW CREATE TABLE tablename)? Пожалуйста редактировать свой вопрос.

O. Jones 11.06.2018 17:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
289
0

Другие вопросы по теме