2017-02-02 7 views
2

Используя Laravel Eloquent, я копирую 7 миллионов строк данных из одной таблицы в моей старой базе данных Mysql и помещая эти строки в разные таблицы в моей новой базе данных Mysql. Проблема в том, что для выполнения этого потребовалось почти один день, и мне нужно повторно выполнить это действие почти для 80M строк. Я использую кусок из 1000 данных за раз. Есть ли способ сделать это более эффективно ?? Вот мой код:Копирование миллионов строк данных из одной базы данных в другую на laravel

DB::connection('oldDataBase')->table('tableToCopy')->chunk(1000, function ($AllData){ 
     foreach ($AllData as $Data){ 
      DB::connection('newDataBase')->table('table1')->insert(
       [ 
        column1 => $Data->columnToCopy, 
        etc.. 
       ]); 


      DB::connection('newDataBase')->table('table2')->insert(
       [ 
        column1 => $Data->columnToCopy, 
        etc.. 
       ]); 
      DB::connection('newDataBase')->table('table3')->insert(
       [ 
        column1 => $Data->columnToCopy, 
        etc.. 
       ]); 
     } 
    }); 
+3

Если это всего лишь одноразовая копия, возможно, лучше сделать это как sqldump, а затем запустить выходной скрипт против нового db – Andy

+3

Не делайте этого через laravel. Laravel делает запрос, а затем преобразовывает в коллекции объектов, накладные расходы, которые определенно будут складываться. Сделать mysqldump | mysql -e' или 'mysqldbcopy' или даже более простой' create table like othertable' и 'insert into table select from other table' – apokryfos

+0

Спасибо за ответ, ребята, я сделаю это, как вы предлагаете. –

ответ

1

Выполнение этой миграции данных от клиента SQL, как Laravel не является хорошей идеей.

Если бы я должен был двигаться 80М строк, я бы следующие шаги:

  1. сваливать их в CSV форме.
  2. разбивает файлы CSV на куски примерно на 500 тыс. Строк.
  3. создавать таблицы в целевой системе
  4. отключить все ограничения и индексы целевой системы.
  5. use LOAD DATA INFILE, чтобы разделить файлы CSV один за другим. Для достижения самых быстрых результатов это должно выполняться из клиентской программы командной строки mysql или mysqlimport, запущенной на той же машине, что и сервер MySQL.
  6. снова включить ограничения и построить индексы.

Я проверил бы это подробно до дня миграции. Я бы сделал такие вещи, как загрузка первого и последнего фрагмента CSV и повторного включения индексов и ограничений.

В комментарии также была высказана другая возможность. Используйте mysqldump, затем загрузите полученный файл через клиентскую программу mysql.

Избегайте использования клиентской программы mysql в стиле gui для этого. Придерживайтесь программ командной строки. Как и клиенты GUI, они не предназначены для потоковой передачи в файлах с несколькими десятками мегабайт. SQL.

+0

Спасибо за помощь. Я постараюсь. –

+0

для обработки и импорта CSV-файла - это просто кошмар – Naeem