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.