Как быстро добавлять / обновлять миллионы строк в БД Laravel?

Добавление и обновление миллионов строк в базе данных является сложной задачей, но в Laravel есть несколько подходов, которые могут ускорить этот процесс. Вот несколько рекомендаций:

1. Используйте Mass Assignment (Массовое присваивание) и Eloquent ORM:
Laravel предоставляет ORM под названием Eloquent, который позволяет существенно упростить взаимодействие с базой данных. Используя Eloquent и массовое присваивание, вы можете добавить и обновить несколько записей за один запрос.

Пример для добавления миллиона записей:

   $data = [];

   for ($i = 0; $i < 1000000; $i++) {
       $data[] = ['column1' => 'value1', 'column2' => 'value2'];
   }

   Model::insert($data);

Пример для обновления миллиона записей:

   Model::where('column1', 'value')->update(['column2' => 'new value']);

2. Используйте Bulk Insert (Массовая вставка):
Вместо вставки каждой строки отдельно, вы можете использовать функцию insert() для массовой вставки. Laravel предоставляет метод insert() для моделей, который вставляет несколько записей за один запрос.

Пример массовой вставки миллиона записей:

   $data = [];

   for ($i = 0; $i < 1000000; $i++) {
       $data[] = ['column1' => 'value1', 'column2' => 'value2'];
   }

   DB::table('table')->insert($data);

3. Используйте транзакции:
При массовом обновлении или добавлении большого количества записей, рекомендуется использовать транзакции. Транзакции позволяют обернуть операции в базе данных в логическую группу и обеспечивают целостность данных. Такой подход может улучшить производительность, уменьшив накладные расходы на единичные операции записи.

Пример использования транзакции:

   DB::transaction(function () {
       for ($i = 0; $i < 1000000; $i++) {
           Model::create(['column1' => 'value1', 'column2' => 'value2']);
       }
   });

4. Оптимизация индексов и запросов:
При обновлении или добавлении множества записей может возникнуть необходимость в оптимизации базы данных и индексов. Индексы помогут ускорить операции поиска и обновления данных, поэтому их следует создавать на соответствующих столбцах. Также, при массовых операциях с базой данных, полезно использовать определенные запросы, такие как chunk() или cursor(), чтобы считывать данные блоками или пакетами для улучшения производительности.

Пример использования chunk():

   Model::chunk(1000, function ($models) {
       foreach ($models as $model) {
           // Обработка записей
       }
   });

Пример использования cursor():

   foreach (Model::cursor() as $model) {
       // Обработка записей
   }

Это некоторые способы оптимизации добавления и обновления миллионов строк в базе данных с помощью Laravel. Они помогут увеличить скорость выполнения операций и повысить производительность вашего приложения.