Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira mais rápida de inserir/atualizar um milhão de linhas no Laravel 5.7

Desabilitar autocommit e confirmar manualmente no final da inserção


De acordo com a documentação do MySQL 8.0. (8.5.5 Carregamento de dados em massa para tabelas InnoDB )

Você pode aumentar a velocidade de INSERT desativando a confirmação automática:

Outra maneira de fazer isso no Laravel é usando Database Transactions :
DB::beginTransaction()

// Your inserts here

DB::commit()

Use INSERT com vários VALUES


Também de acordo com a documentação do MySQL 8.0 (8.2.5.1 Otimizando instruções INSERT ), você pode otimizar a velocidade de INSERT usando vários VALUES em uma única instrução de inserção.

Para fazer isso com o Laravel, você pode simplesmente passar um array de valores para o insert() método:
DB::table('your_table')->insert([
   [
       'column_a'=>'value',
       'column_b'=>'value',
   ],
   [
       'column_a'=>'value',
       'column_b'=>'value',
   ],
   [
       'column_a'=>'value',
       'column_b'=>'value',
   ],
]);

De acordo com os documentos, pode ser muitas vezes mais rápido.

Leia os documentos


Ambos os links de documentos do MySQL que coloquei neste post têm muitas dicas sobre como aumentar a velocidade do INSERT.

Evite usar Laravel/PHP para inseri-lo


Se sua fonte de dados é (ou pode ser) um arquivo CSV, você pode executá-lo muito mais rápido usando mysqlimport para importar os dados.

Usar PHP e Laravel para importar dados de um arquivo CSV é uma sobrecarga, a menos que você precise fazer algum processamento de dados antes de inserir.