Qual é a melhor maneira de conseguir inserções rápidas de grandes quantidades de dados em MySQL?

StackOverflow https://stackoverflow.com/questions/314593

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.

Foi útil?

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 :

  1. Mova os arquivos lá e conectar sobre o soquete
  2. unix
  3. Gerar, em vez das inserções, um LOAD DATA INFILE arquivo
  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top