- 1 1. Introduction
- 2 2. Basics of Bulk Insert
- 3 3. Methods for Bulk Insert in MySQL
- 4 4. Considerações e Limitações de Inserção em Massa
- 5 5. Melhores Práticas de Inserção em Massa
- 6 6. Ajuste de Desempenho de Inserção em Massa
- 7 7. Exemplo Prático de Inserção em Massa
- 8 8. Perguntas Frequentes
- 8.1 Q1: Recebo um erro dizendo “Duplicate entry” durante a inserção em massa. Como devo lidar com isso?
- 8.2 Q2: Recebo um erro “Permission denied” ao usar LOAD DATA INFILE. O que devo fazer?
- 8.3 Q3: O desempenho da inserção em massa não está melhorando tanto quanto o esperado. O que devo verificar?
- 8.4 Q4: Ocorram erros devido a problemas de formatação CSV. Qual é o formato correto?
- 8.5 Q5: Como posso manter a integridade dos dados?
- 9 9. Resumo
1. Introduction
The Importance of Bulk Insert
Ao trabalhar com MySQL, pode ser necessário inserir grandes volumes de dados em um banco de dados de forma eficiente. Por exemplo, armazenar dados de logs, realizar migrações de dados ou importar grandes conjuntos de dados CSV em massa. No entanto, inserir registros um a um usando instruções INSERT padrão pode consumir muito tempo e degradar significativamente o desempenho.
É aqui que a inserção em massa se torna útil. A inserção em massa permite inserir várias linhas de dados em uma única consulta, melhorando significativamente o desempenho do MySQL.
Purpose of This Article
Este artigo explica detalhadamente a inserção em massa no MySQL — desde o uso básico até técnicas avançadas, considerações importantes e dicas de otimização de desempenho. Exemplos claros são incluídos para garantir que até mesmo iniciantes possam entender e aplicar esses métodos.
2. Basics of Bulk Insert
What Is Bulk Insert?
Inserção em massa no MySQL refere-se à inserção de múltiplas linhas de dados usando uma única consulta. Esse método é mais eficiente do que executar repetidamente instruções INSERT individuais.
Por exemplo, uma abordagem INSERT normal insere linhas uma a uma, como mostrado abaixo:
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
Usando inserção em massa, os mesmos dados podem ser inseridos em uma única instrução:
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
Advantages of Bulk Insert
- Improved Performance Processar várias linhas de uma vez reduz o número de execuções de consultas e diminui a sobrecarga de comunicação de rede e I/O de disco.
- Simplified Transaction Management Várias linhas podem ser processadas em uma única transação, facilitando a manutenção da consistência dos dados.
- Cleaner Code Reduz código repetitivo, melhorando a manutenibilidade.
Common Use Cases for Bulk Insert
- Armazenamento regular de grandes volumes de dados de log
- Importação de dados de sistemas externos (por exemplo, leitura de arquivos CSV)
- Tarefas de migração de dados e restauração de backups
3. Methods for Bulk Insert in MySQL
Using Multi-Row INSERT Statements
O MySQL permite inserção em lote usando a sintaxe INSERT de múltiplas linhas. Esse método é simples e adequado para muitos cenários.
Basic Syntax
A seguir está a sintaxe básica para inserir múltiplas linhas de uma vez:
INSERT INTO table_name (column1, column2, ...) VALUES
(value1, value2, ...),
(value3, value4, ...),
...;
Example
O exemplo abaixo insere três linhas na tabela users:
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com');
Pros and Cons
- Pros
- Fácil de implementar e intuitivo para quem está familiarizado com SQL.
- A consistência dos dados pode ser mantida usando transações.
- Cons
- Se o volume de dados for muito grande, a consulta pode exceder o limite de tamanho (o padrão é 1 MB).
Using the LOAD DATA INFILE Command
LOAD DATA INFILE insere de forma eficiente grandes quantidades de dados a partir de um arquivo de texto (como formato CSV). É especialmente eficaz em ambientes de servidor MySQL que suportam o carregamento de arquivos.
Basic Syntax
A seguir está a sintaxe básica para LOAD DATA INFILE:
LOAD DATA INFILE 'file_path'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Example
O exemplo a seguir insere dados do arquivo users.csv na tabela users.
- CSV File Content
Alice,alice@example.com Bob,bob@example.com Charlie,charlie@example.com
- Executing the Command
LOAD DATA INFILE '/path/to/users.csv' INTO TABLE users FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Pros and Cons
- Prós
- Extremamente rápido e eficiente para grandes conjuntos de dados.
- Usa operações nativas de arquivos, tornando-o adequado para importações em larga escala.
- Contras
- Depende de caminhos de arquivos e configurações de permissão.
- Alguns servidores desativam
LOAD DATA INFILEpor razões de segurança.
Usando o Utilitário mysqlimport
mysqlimport é uma ferramenta de linha de comando incluída no MySQL que importa grandes quantidades de dados a partir de arquivos. Ela funciona como um wrapper para LOAD DATA INFILE.
Sintaxe Básica
mysqlimport --local database_name file_name
Exemplo
O exemplo a seguir importa users.csv para a tabela users:
mysqlimport --local --fields-terminated-by=',' --lines-terminated-by='\n' my_database /path/to/users.csv
Prós e Contras
- Prós
- Fácil de executar a partir da linha de comando.
- Rápido, semelhante ao
LOAD DATA INFILE. - Contras
- Erros podem ocorrer se o formato do arquivo estiver incorreto.
- Pode levar tempo para se familiarizar em comparação com escrever SQL diretamente.
4. Considerações e Limitações de Inserção em Massa
Limites de Tamanho de Consulta
No MySQL, a quantidade de dados que pode ser enviada em uma única consulta é limitada. Esse limite é controlado pela configuração max_allowed_packet. O valor padrão é 1 MB, mas se você inserir grandes volumes de dados, pode ser necessário aumentar esse valor.
Soluções
- Aumente
max_allowed_packetnas configurações do servidor:SET GLOBAL max_allowed_packet = 16M;
- Divida as inserções em lotes menores (por exemplo, processe 1 000 linhas por lote).
Impacto dos Índices
Ao realizar inserções em massa em uma tabela com muitos índices, o MySQL pode atualizar os índices para cada linha inserida, o que pode desacelerar o processo.
Soluções
- Desativar temporariamente os índices antes de inserir: Se você inserir muitos dados, pode ser eficaz remover os índices temporariamente e recriá‑los após a conclusão da inserção.
ALTER TABLE table_name DISABLE KEYS; -- Bulk insert operations ALTER TABLE table_name ENABLE KEYS;
- Adicionar índices após inserir os dados: Reconstruir os índices após a inserção permite que os índices sejam criados em massa, frequentemente melhorando a velocidade.
Gerenciamento de Transações
Ao inserir grandes volumes de dados, podem ocorrer erros e algumas linhas podem falhar ao ser inseridas. O uso de transações ajuda a manter a consistência nesses casos.
Soluções
Use transações para que a inserção seja confirmada somente se todos os dados forem inseridos com sucesso.
START TRANSACTION;
INSERT INTO table_name ...;
-- Execute all required insert operations
COMMIT;
Se ocorrer um erro, faça rollback para evitar inserções parciais.
ROLLBACK;
Segurança e Permissões
Ao usar LOAD DATA INFILE ou mysqlimport, são necessárias permissões de leitura de arquivos. Contudo, alguns ambientes de servidor restringem essas operações por motivos de segurança.
Soluções
- Se o servidor não permitir
LOAD DATA INFILE, use oLOAD DATA LOCAL INFILEdo lado do cliente. - Confirme as permissões necessárias e solicite a um administrador que aplique as configurações adequadas.
Outras Observações
- Consistência de conjunto de caracteres: Se o conjunto de caracteres do arquivo de dados não corresponder às configurações da tabela, você pode ver caracteres corrompidos ou erros. Verifique a codificação antes de inserir.
- Risco de deadlock: Se múltiplos processos inserirem dados ao mesmo tempo, deadlocks podem ocorrer. Serializar as operações de inserção pode ajudar a evitá‑los.
5. Melhores Práticas de Inserção em Massa
Usar Transações
Como mencionado acima, transações ajudam a manter a consistência dos dados. Isso é especialmente útil ao inserir dados em várias tabelas.
START TRANSACTION;
-- Execute bulk insert
COMMIT;
Otimizar Operações de Índice
Desativar os índices antes de inserir e reconstruí‑los depois pode melhorar drasticamente a velocidade de inserção.
ALTER TABLE table_name DISABLE KEYS;
-- Execute bulk insert
ALTER TABLE table_name ENABLE KEYS;
Escolher um Tamanho de Lote Apropriado
Ao inserir uma grande quantidade de dados, selecionar um tamanho de lote apropriado (número de linhas por consulta) maximiza a eficiência. Em geral, de 1.000 a 10.000 linhas por lote costuma ser considerado razoável.
Exemplo Prático
Inserir em lotes a cada 1.000 linhas costuma ser eficiente:
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- about 1000 rows
;
Validar Dados Antes de Inserir
Verificar se os formatos e valores dos dados estão corretos antes de inserir ajuda a prevenir erros.
# Example: Data validation using Python
import csv
with open('users.csv', mode='r') as file:
reader = csv.reader(file)
for row in reader:
# Check whether the format is valid
if '@' not in row[1]:
print(f"Invalid email format: {row[1]}")
Implementar Tratamento de Erros
Para se preparar para falhas, registre logs de erro para que a depuração se torne mais fácil.
LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
LOG ERRORS INTO 'error_log';
6. Ajuste de Desempenho de Inserção em Massa
Otimizar Tamanho do Lote
O número de linhas inseridas por consulta (tamanho do lote) tem um grande impacto no desempenho. Escolher um tamanho adequado reduz a comunicação de rede e a sobrecarga de I/O de disco, permitindo inserções mais eficientes.
Melhores Práticas
- Tamanho recomendado : Normalmente de 1.000 a 10.000 linhas por lote.
- Se o tamanho do lote for muito pequeno, o número de consultas aumenta, elevando a sobrecarga de rede e disco.
- Se o tamanho do lote for muito grande, você pode atingir os limites de
max_allowed_packetou aumentar o uso de memória.
Exemplo
Divida os dados e insira-os em várias execuções conforme mostrado abaixo:
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- up to 1000 rows
;
Desativar Índices Temporariamente
Atualizar índices durante a inserção em massa causa a recalculação do índice a cada inserção, o que pode desacelerar o processamento.
Solução
- Desative os índices antes de inserir e reconstrua-os após a conclusão da inserção.
ALTER TABLE table_name DISABLE KEYS; -- Execute bulk insert ALTER TABLE table_name ENABLE KEYS;
Usar Bloqueios de Tabela
Bloquear a tabela temporariamente durante a inserção em massa pode evitar contenção com outras consultas e melhorar a velocidade.
Exemplo
LOCK TABLES table_name WRITE;
-- Execute bulk insert
UNLOCK TABLES;
Otimizando LOAD DATA INFILE
LOAD DATA INFILE é um dos métodos de inserção em massa mais rápidos, e você pode melhorar ainda mais o desempenho usando as opções abaixo.
Exemplos de Opções
IGNORE: Ignora linhas duplicadas e insere o restante.LOAD DATA INFILE '/path/to/file.csv' INTO TABLE users IGNORE;
CONCURRENT: Minimiza o impacto mesmo quando a tabela está sendo usada por outras consultas.LOAD DATA CONCURRENT INFILE '/path/to/file.csv' INTO TABLE users;
Ajustar Configurações do MySQL
innodb_buffer_pool_sizeSe você usa tabelas InnoDB, aumentar este parâmetro pode melhorar o desempenho de leitura/gravação.SET GLOBAL innodb_buffer_pool_size = 1G;
bulk_insert_buffer_sizeSe você usa tabelas MyISAM, definir este parâmetro pode melhorar o desempenho de inserção em massa.SET GLOBAL bulk_insert_buffer_size = 256M;
- Desativar temporariamente
autocommitDesativeautocommitdurante as inserções e, em seguida, reative-o depois.SET autocommit = 0; -- Execute bulk insert COMMIT; SET autocommit = 1;
Comparação de Desempenho Antes/Depois
Você pode medir o desempenho antes e depois do ajuste usando um script como o seguinte:
-- Record a timestamp before inserting
SET @start_time = NOW();
-- Execute bulk insert
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- about 1000 rows
-- Measure execution time
SELECT TIMESTAMPDIFF(SECOND, @start_time, NOW()) AS execution_time;
Isso permite que você confirme os efeitos de ajuste com números concretos.
7. Exemplo Prático de Inserção em Massa
Exemplo: Inserir Dados de Usuário a partir de um Arquivo CSV
1. Preparar os Dados
Primeiro, prepare os dados a serem inseridos no formato CSV. Neste exemplo, usamos um arquivo users.csv contendo informações do usuário (nome e endereço de e‑mail).
Alice,alice@example.com
Bob,bob@example.com
Charlie,charlie@example.com
2. Criar a Tabela
Crie uma tabela para inserir os dados.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
3. Inserção em Massa: INSERT Multi-Linha
Para conjuntos de dados pequenos, você pode inserir dados usando uma instrução INSERT multi‑linha como mostrado abaixo:
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com');
4. Inserção em Massa: LOAD DATA INFILE
Para conjuntos de dados grandes, usar LOAD DATA INFILE é uma abordagem eficiente.
Exemplo de Comando
LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, email);
5. Medir o Desempenho
Para verificar a eficiência da inserção, execute um teste de desempenho simples.
Exemplo de Script
SET @start_time = NOW();
LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, email);
SELECT TIMESTAMPDIFF(SECOND, @start_time, NOW()) AS execution_time;
Este script exibe o tempo necessário para a inserção dos dados em segundos.
8. Perguntas Frequentes
Q1: Recebo um erro dizendo “Duplicate entry” durante a inserção em massa. Como devo lidar com isso?
A1:
Erros de duplicação ocorrem quando parte dos dados inseridos conflita com dados existentes. Você pode lidar com isso usando os métodos abaixo.
- Use a opção
IGNOREIgnora erros de duplicação e insere as linhas restantes.INSERT IGNORE INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com');
- Use
ON DUPLICATE KEY UPDATEAtualiza as linhas existentes quando ocorrem duplicatas.INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com') ON DUPLICATE KEY UPDATE email = VALUES(email);
Q2: Recebo um erro “Permission denied” ao usar LOAD DATA INFILE. O que devo fazer?
A2:
Este erro ocorre quando o servidor MySQL não permite o comando LOAD DATA INFILE. Você pode resolvê‑lo usando os seguintes métodos:
- Use
LOAD DATA LOCAL INFILESe estiver lendo o arquivo a partir da máquina cliente, use a opçãoLOCAL.LOAD DATA LOCAL INFILE '/path/to/users.csv' INTO TABLE users FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
- Verifique as configurações do MySQL Confirme que
local_infileestá habilitado no servidor.SHOW VARIABLES LIKE 'local_infile'; SET GLOBAL local_infile = 1;
Q3: O desempenho da inserção em massa não está melhorando tanto quanto o esperado. O que devo verificar?
A3:
Verifique os seguintes pontos e otimize as configurações de acordo:
Reduza o número de índices Desativar temporariamente os índices durante a inserção em massa pode melhorar a velocidade (veja “Impacto dos Índices” acima).
Ajuste o tamanho do lote Escolha um tamanho de lote adequado (geralmente de 1.000 a 10.000 linhas) com base no volume de dados.
Ajuste as configurações do MySQL
- Aumente
innodb_buffer_pool_size(para InnoDB). - Ajuste
bulk_insert_buffer_size(para MyISAM).
- Use bloqueios de tabela Bloqueie a tabela temporariamente para evitar contenção com outras consultas.
LOCK TABLES users WRITE; -- Execute bulk insert UNLOCK TABLES;
Q4: Ocorram erros devido a problemas de formatação CSV. Qual é o formato correto?
A4:
Confirme que o CSV atende aos requisitos abaixo:
- Separe cada campo com uma vírgula (
,).Alice,alice@example.com Bob,bob@example.com
- Se os dados contiverem caracteres especiais, escape‑os corretamente.
"Alice O'Conner","alice.o@example.com"
- Certifique-se de que a última linha termina com um caractere de nova linha.
- Se a linha final não terminar com uma nova linha, ela pode ser ignorada.
Q5: Como posso manter a integridade dos dados?
A5:
Você pode garantir a integridade dos dados usando os métodos abaixo:
- Use transações Confirme apenas se todos os dados forem inseridos com sucesso para manter a consistência.
START TRANSACTION; -- Execute bulk insert COMMIT;
- Valide os dados de entrada Antes de inserir, use scripts ou ferramentas para verificar o formato dos dados e duplicatas.
- Use logs de erro Registre linhas inválidas, corrija-as depois e reinsira.
LOAD DATA INFILE '/path/to/users.csv' INTO TABLE users LOG ERRORS INTO 'error_log';

9. Resumo
A Importância da Inserção em Massa
A inserção em massa no MySQL é uma técnica poderosa para inserir eficientemente grandes volumes de dados. Comparada ao uso repetido de instruções INSERT padrão, a inserção em massa reduz o número de execuções de consultas e pode melhorar significativamente o desempenho.
Este artigo abordou os seguintes pontos principais em detalhe:
- Fundamentos da Inserção em Massa
- Conceitos básicos e casos de uso típicos.
- Métodos Práticos de Execução
- Inserindo dados usando INSERT de múltiplas linhas,
LOAD DATA INFILEemysqlimport.
- Considerações e Restrições
- Limites de tamanho de consulta, impactos em índices e questões de permissão/segurança, juntamente com soluções.
- Ajuste de Desempenho
- Otimizando tamanhos de lote, usando bloqueios de tabela e ajustando a configuração do MySQL.
- Exemplo Prático
- Passos concretos com dados de exemplo e medição de desempenho.
- FAQ
- Problemas operacionais comuns e soluções.
Experimente no Seu Ambiente
Usando os métodos apresentados neste artigo, você pode começar a experimentar a inserção em massa imediatamente. Experimente os passos a seguir:
- Prepare um pequeno conjunto de dados e teste com um INSERT de múltiplas linhas.
- Para conjuntos de dados grandes, experimente
LOAD DATA INFILEe meça o desempenho. - Conforme necessário, adicione transações e tratamento de erros e aplique a abordagem em ambientes de produção.
Aprendizado Adicional
Para uso mais avançado e detalhes, consulte o recurso a seguir:
Notas Finais
A inserção em massa no MySQL pode melhorar drasticamente a eficiência do banco de dados quando usada corretamente. Use o que aprendeu aqui para melhorar o desempenho em seu sistema e alcançar uma melhor gestão de dados.


