Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou passando por um problema meio chato, eu tenho uma rotina na minha hospedagem (locaweb) que realiza o download de XML, depois deste carregamento eu começo a gravação dos dados num arquivo txt no proprio host - aí que chega o problema:
depois eu tenho outra rotina que pega este txt e joga pro banco mysql, só que são em torno de 10 mil querys de update. E quando chega la pelos 2 mil ele aborta por causa de sobrecarga (é o que estou imaginando)
tem como eu melhorar este ponto, talvez ler de 1000 em 1000 e dar um tempo, ou alguma outra solução?
estou sem saber, e nao consigo mudar minha hospedagem por que vai ficar muito caro
eh, estou indo por este caminho mesmo
criando varios cron de 1000 em 1000 :(
nem de 1000 em 1000 esta dando certo, retorna erro 503 parecendo ser sobrecarga de tantas clausulas update
existe alguma outra sugestão, tentei colocar um usleep(5000000) mas ainda assim ele aborta :(
Tenta colocar um unset no final de cada loop. Penso que estas a utilizar foreach
Se for MySQL e:
Sugiro utilizar [INSERT ... ON DUPLICATE KEY UPDATE.](https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html)
Assim, você consegue fazer um INSERT com 500 registros sem precisar ficar repetindo INSERT INTO... INSERT INTO... ou UPDATE ... UPDATE... UPDATE...
@braços
Tenta colocar um unset no final de cada loop. Penso que estas a utilizar foreach
estou utilizando foreach, desta forma
foreach($xml->Data->Usuarios as $usuarios){
$fp = fopen("update_$Nick.txt", "a");
$escreve = fwrite($fp, "UPDATE usuario SET id = $id, nome = $nome WHERE id = $id_tabela2 AND idade = 18;" . "\n");
fclose($fp);
aí ele escreve as 1000 querys de update num txt. Depois de ler tudo eu leio este txt e vou jogando pra base de dados
UPDATE usuario SET id = 1, nome = nome1 WHERE referencia = 10 AND idade = 18;
UPDATE usuario SET id = 2, nome = nome2 WHERE referencia = 20 AND idade = 18;
UPDATE usuario SET id = 3, nome = nome3 WHERE referencia = 30 AND idade = 18;
UPDATE usuario SET id = 4, nome = nome4 WHERE referencia = 40 AND idade = 18;
UPDATE usuario SET id = 5, nome = nome5 WHERE referencia = 50 AND idade = 18;
foreach (glob('*.txt') as $arquivo) {
$arquivo = "$arquivo";
$arq = fopen($arquivo, 'r');
$i = 0;
while(!feof($arq)){
$linha[] = fgets($arq);
if ($pause == 80){
$sql = " $linha[$i] ";
$result = mysql_query($sql);
$pause = 0;
usleep(5000000); $sql = " $linha[$i] ";
$result = mysql_query($sql);
}
$i++;
$pause++;
}
unlink("$arquivo");
}
>
Se for MySQL e:
Sugiro utilizar [INSERT ... ON DUPLICATE KEY UPDATE.](https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html)
Assim, você consegue fazer um INSERT com 500 registros sem precisar ficar repetindo INSERT INTO... INSERT INTO... ou UPDATE ... UPDATE... UPDATE...
@braços
não entendi muito bem, meu ingles é pessimo, tem como dar um exemplo ou algum termo pra procurar
unica coisa que tem na minha tabela é o ID que é autoincremente, resto e tudo int ou varchar
Meu inglês também não é dos melhores, mas com a internet isto não é mais uma barreira.
No link que passei do manual do MySQL tem exemplos do que você precisa.
@braços
eu tinha usado o translate, o problema foi entender o que realmente era pra ser feito
parece ser utilizar numa mesma query varios update, mas no meu caso eu uso where nas querys, e aí?
Não, então você não entendeu.
Você vai fazer um INSERT e se a chave primária / unica já existir, ele faz um update para você, mas é uma query só com 500 registros.
Mega-ultra-hiper-super-max-total-power mais rápido do que gerar 500 updates.
então em vez de usar o update em cada registro, seria mais rapido eu apagar este registro e fazer um insert simples?
seria isso?
Não. Não é isso.
Leia o link que te passei.
li, reli e nao entendi
Obrigado, vou ver outra forma
Faça uma rotina simples de 1000 em 1000, com um pause para não sobrecarregar o banco de dados.
faça um backup via .zip pelo PHPMyadmin.