MySQL “inserções” diferença de velocidade entre a produção eo meio ambiente local é muito grande!

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

Pergunta

Eu instalei o MySQL 5.1x instância em uma máquina Linux (RAM 768MB). Eu restaurei uma cópia de segurança de cerca de 1000 linhas e através do meu aplicativo .NET (implantado em um servidor web diferente Windows) I realizadas certas operações de leitura, que, ao considerar que a mesa não tinha índices, foram rápidos.

Eu, então, limpou o servidor a partir destas linhas e usou uma característica em minha aplicação web no outro servidor para inserir linhas (Basicamente, eu ler o texto fora de um arquivo de texto, inserir os dados em campos de uma classe personalizada, e em seguida, chamar um procedimento armazenado com esses parâmetros para cada registro). Quando tive a website e banco de dados tanto em minha máquina local, eu iria inserir 2500 linhas instantaneamente (menos de um segundo). Agora, no entanto, no ambiente de "produção", esses mesmos 2500 linhas estão levando 10 minutos para ser inserido. Eu estou usando o my.cnf padrão que vem com a instalação do MySQL.

Existe alguma maneira eu posso otimizar as gravações sem comprometer a velocidade das operações de leitura? Ou estou faltando algo óbvio?

Agradecemos antecipadamente!

Foi útil?

Solução

Você já olhou para a página do manual MySQL para a velocidade de inserção ? A primeira suposição que vem à mente para mim é que você não está envolvendo o conjunto de 2500 procedimentos em uma Comece Transação / Commit declaração, de modo MySQL é autocommitting cada uma das 2500 acções.

Outras dicas

Além do problema mencionado por Mark (auto-commit em vez de transação), eu definitivamente investigar usando atualizações em lote. Porque uma grande diferença entre uma ligação local e uma conexão de rede (mesmo um muito rápido um) é o tempo de ida e volta.

Enquanto a largura de banda é mais provável não o fator limitante, neste caso, fazendo 2500 roundtrips rede para o banco de dados e volta definitivamente vai levar muito mais tempo em uma rede do que na máquina local.

Usar uma atualização em lote pode reduzir essas inserções para uma única ida e volta ideal e apenas uns poucos em prática.

Infelizmente eu não posso dizer-lhe como fazer essas atualizações em lote no mundo da NET, em Java você pode usar PreparedStatement.addBatch() . Eu tenho certeza que há algo semelhante em .NET.

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