mysql insere dados em massa

1

Editar:

Percebi que, se eu construir uma consulta grande na memória, a velocidade aumentou quase 10 vezes de magnitude

insert ignore into xxx(col1, col2) values('a',1), values('b',1), values('c',1)...

Editar:

desde que eu tenha um índice na primeira coluna, o tempo de inserção aumenta à medida que eu insiro mais. Posso atrasar o índice até o final?

Original:

Estou usando o seguinte para inserir em lote 10 milhões de linhas no banco de dados do mysql (não todas de uma vez, já que elas não se encaixam na memória), é muito lento (levando muitas horas). devo usar o arquivo de carga para melhorar o desempenho? Eu teria que criar um segundo arquivo para armazenar todos os 10 milhões de linhas e, em seguida, carregar isso em db. existem melhores maneiras?

PreparedStatement st=con.prepareStatement("insert ignore into xxx (col1, col2) "+
    " values (?, 1)");
Iterator<String> d=data.iterator();

while(d.hasNext()){
    st.clearParameters();
    st.setString(1, (d.next()).toLowerCase());
    st.addBatch();
}
int[]updateCounts=st.executeBatch();
    
por user12145 31.01.2011 / 09:23

2 respostas

1

Você pode fazer algumas coisas para acelerar a inserção do lote.

  • Desabilite quaisquer índices e chaves na sua tabela antes do upload, isso permitirá que qualquer linha duplicada seja inserida (um pouco confusa, mas fácil de limpar depois), mas vai acelerar a inserção de um grande negócio

  • Faça um lote COMMIT a cada N linhas. Se você estiver usando uma tabela InnoDB que funcione de uma maneira completamente transacional, apenas COMITE todas as N linhas (não o faça muito baixo ou muito alto) para que toda a transação não seja armazenada na memória antes de se comprometer com o disco

Deixe-me saber como esses truques funcionam para você!

    
por 31.01.2011 / 10:11
0

Eu sugeriria inserir na tabela temporária, sem índices, e depois inserir nela.

    
por 01.02.2011 / 07:54

Tags