Pergunta

estou looping através de uma série de valores (1 a 100, por exemplo) e a execução de uma instrução preparada dentro do ciclo.

Existe e vantagem de usar uma transação - cometer após o término do loop -? Comparado a uma execução direta dentro do loop

Os valores não são dependentes um do outro para que uma transação não é necessária a partir desse ponto de vista.

Foi útil?

Solução

Se suas consultas são INSERTs, a página 7.2.19 . Velocidade de INSERT do manual MySQL dá duas informações interessantes, dependendo se você está usando um motor transactionnal ou não:

Ao usar um motor não transactionnal:

Para acelerar as operações de INSERT que são executado com várias declarações para tabelas não transacionais, bloquear o seu mesas.

Isto beneficia o desempenho porque o tampão índice é descarregado para o disco única uma vez, depois de todas instruções INSERT tem completou. Normalmente, não haveria como muitos tampão índice rubores como existem INSERT. travamento explícito declarações não são necessários, se puder inserir todas as linhas com uma única INSERT.

E, com um motor transactionnal:

Para obter inserções mais rápidas para tabelas transacionais, você deve usar START TRANSACTION e COMMIT em vez de LOCK TABLES.

Então, eu estou supondo o uso de transações pode ser uma boa ideia - mas suponho que poderia depender da carga no seu servidor, e se existem usos múltiplos usando a mesma tabela no mesmo momento, e tudo o que ...

Existem mais informações sobre a página que eu ligado a, por isso não hesite em lê-lo; -)


E, se você estiver fazendo atualização declarações :

Outra maneira de obter atualizações rápidas é atraso atualizações e, em seguida, fazer muitas atualizações seguidos mais tarde. múltipla executando atualiza juntos é muito mais rápido do que fazendo um de cada vez, se você bloquear a mesa.

Então, eu estou supondo que o mesmo pode ser dito do que para inserções.


BTW: com certeza, você pode tentar as duas soluções, aferindo o seu desempenho com microtime , no lado do PHP, por exemplo ; -)

Outras dicas

Por um tempo mais rápido do que você poderia fazer todas as inserções em um tiro, ou agrupá-los, talvez 5 ou 10 de cada vez, como se uma inserção falha todo o lote vai.

http://www.desilva.biz/mysql/insert.html

A transação vai ficar mais lento, por isso, se você não precisa dele, então não usá-lo.

Uma preparado declaração seria uma boa escolha embora mesmo que você fez inserções em lote, como você não tem que continuar a construir-se a consulta de cada vez.

Eu enfrentei a mesma pergunta quando eu tive que implementar um arquivo CSV (possivelmente bastante longa) importação de dados (eu sei que você pode usar o LOAD DATA INFILE sintaxe para isso, mas eu tinha que aplicar algum processamento em meus campos antes de inserção).

Então eu fiz uma experiência com transações e um arquivo com cerca de 15k linhas. O resultado é que, se eu inserir todos os registros dentro de uma transação única, leva apenas alguns segundos e é vinculado à CPU. Se eu não usar qualquer transação em tudo, ele leva vários minutos e é IO limitada. Ao cometer a cada N linhas, eu tenho resultados intermediários.

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