Qual é a melhor maneira de conseguir inserções rápidas de grandes quantidades de dados em MySQL?
-
10-07-2019 - |
Pergunta
Eu escrevi um programa em C para analisar grandes arquivos XML e, em seguida, criar arquivos com instruções de inserção. Algum outro processo iria ingerir os arquivos em um banco de dados MySQL. Estes dados servirá como um serviço de indexação de modo que os usuários podem encontrar documentos com facilidade.
Eu escolhi InnoDB para a capacidade de bloqueio em nível de linha. O programa de C irá gerar qualquer onde de 500 a 5 milhões de instruções de inserção sobre uma determinada chamada.
Qual é a melhor maneira de obter todos os dados no banco de dados o mais rápido possível? A outra coisa a notar é que o DB está em um servidor separado. Vale a pena mover os arquivos para esse servidor para acelerar inserções?
EDIT: Esta tabela não vai realmente ser atualizado, mas linhas serão excluídas.
Solução
- Use a ferramenta mysqlimport ou o comando LOAD DATA INFILE.
- índices Temporariamente desativar que você não precisa para integridade de dados
Outras dicas
Eu faria, pelo menos, essas coisas de acordo com a este ligação :
- Mova os arquivos lá e conectar sobre o soquete unix
- Gerar, em vez das inserções, um LOAD DATA INFILE arquivo
- A desactivação índices durante o carregamento
MySQL com os formatos de tabela padrão é maravilhosamente rápido, enquanto ele é uma tabela somente para escrita; então a primeira questão é se você estiver indo para ser atualização ou exclusão. Se não, não vá com innosys - não há necessidade de bloqueio se você está apenas acrescentando. Pode cortar ou mudar o nome do arquivo de saída periodicamente para lidar com o tamanho da tabela.
1. Certifique-se de usar uma transação.
Transações eliminar o
INSERT, SYNC para disco
fase de repetição e, em vez toda a IO de disco é executada quando você confirmar a transação.
2. Certifique-se de utilizar conexão de compressão
Raw texto + GZip fluxo compactado ~ = até 90% de economia em alguns casos, a largura de banda.
3. Utilizar a notação de inserção paralela sempre que possível
INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3)
(Menos texto a enviar, a ação mais curto)
Se você não pode usar LOAD DATA INFILE como já foi sugerido, o uso preparado consultas para inserções.
Realmente depende do motor. Se você estiver usando InnoDB, fazer transações de uso (você não pode evitá-los - mas se você usar autocommit, cada lote é implicitamente em sua própria txn), mas certifique-se que eles são nem muito grande ou muito pequeno
Se você estiver usando MyISAM, as transações são sem sentido. Você pode conseguir uma melhor inserção velocidade, desativando e permitindo índices, mas que só é bom em uma mesa vazia.
Se você começar com uma tabela vazia, que geralmente é melhor.
LOAD DATA é um vencedor de qualquer maneira.