Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Marcos13

[Resolvido] Velocidade de insert BD

Mensagens Recomendadas

Marcos13

Boas, estou a fazer um script, que lê um ficheiro, e insere na base de dados.

O problema é que os ficheiros têem mais de 7000 linhas. Nem todas vao para a base de dados, mas a partida 3500/4000 registos vao entrar na base de dados por cada ficheiro.

A ideia é percorrer varios ficheiros e introduzir tudo na bd.

No inicio deu-me "Maximum execution time of 30 seconds exceeded"

Coloquei isto para remediar: set_time_limit(20);

Feito isto, dei conta que é uma lentidão enorme a entrarem os dados na base de dados.

Algum conselho para colocar isto devidamente a funcionar, com uma velocidade consideravel?

____

Tou a usar:

PHP + MySQL

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Quantas linhas estás a inserir com cada query? Tenta variar este parâmetro, de modo a optimizar o programa. À partida, inserir várias linhas na mesma query é aconselhável.

PS: Mostrar o código que estás a usar também pode ser útil :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marcos13

Nao sei como nao pensei nisso antes....

Pela logica, se a query tiver toda junta é mais rapido, pois faz menos uso dos recursos do mysql_query...

vou ver se consigo meter tudo na mesma query..o pior, é que tenho a inserir em 2 tabelas...

mas vou ver o que consigo resolver...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

As duas tabelas não são problema, pois com milhares de linhas para inserir, usar uma ou duas queries não deve fazer muita diferença. (Até recomendaria separares isso em vários blocos, em vez de usares apenas uma ou duas queries.)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marcos13

Bem, continua a dar barraca...

Gostava de colocar aqui o codigo, mas nao o posso fazer.

Mas caso fosse um projecto teu, como resolvias esta situação?

Varios ficheiros com 7000 linhas. (1 cabeçalho, varios chefes e varios empregados associados a cada chefe)

O que estou a fazer é isto:

Extrai-o o que importa do ficheiro e coloco em arrays.

1 array com o cabeçalho

1 array com os chefes e dentro deste um array com os empregados.

Percorro o cabeçalho uma vez e insiro na base de dados.

Percorro o array chefes e insiro na base de dados.

Vou buscar o id deste ultimo a ser inserido, e insiro o empregado relacionando o id do chefe.

NEste momento demora 5 min para inserir informação de 2 ficheiros ~ 7500 registos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

se fosse eu a fazer milhares de querys ao mesmo tempo, tentaria mandar tudo na mesma "string" e so' mandava um pedido ao servidor.


$query = "INSERT INTO TBL(descricao,nome,aluno) ";
foreach($arrQuerys => $q)
{
 $query .= ("('".$q[0]."','".$q[1]."','".$q[0]."')");
}

$conn->query($query);

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu dei uma solução para este problema num outro tópico que agora não consigo encontrar:

crias uma página que faz pedidos consecutivos de AJAX para inserir da linha M à linha M+N.

desta forma, ultrapassas os limites de tempo de execução do PHP:

// javascript : action
- pedir o número total de linhas ao script
 - após receber o número total de linhas, iniciar o ciclo pela linha L = 0
 - chamar uma função de pedido de inserção da linha L até Min(NLinhas, L+n)

// javascript : funcao inserir(L1, L2)
- pedir para actualizar da linha L1 até L2
 - após receber confirmação do script
   - se L2 < NLinhas
     - chamar uma função de pedido de inserção da linha L2 até Min(NLinhas, L2+n)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Virneto

eu dei uma solução para este problema num outro tópico que agora não consigo encontrar:

crias uma página que faz pedidos consecutivos de AJAX para inserir da linha M à linha M+N.

desta forma, ultrapassas os limites de tempo de execução do PHP:

i remember...

http://www.portugal-a-programar.pt/topic/62215-divisao-de-loop/


"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marcos13

Até parece o mesmo problema/ficheiros, mas não é :)

Eu tive que apressar o codigo porque o meu chefe queria ver resultados, mas no fim de semana vou tentar colocar com ajax...

Não vai ser facil adaptar o codigo da maneira que está ao ajax....Vamos la ver...

O problema principal neste momento é a velocidade. Tanto para inserir como para listar, está uma eternidade...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marcos13

Bem, ao fim de varios testes, lembrei me de ir pesquisar sobre as configurações do mysql, uma vez que tenho instalado o pack Xampp, e a configuração vem de maneira a consumir menos recursos.

Em vez de me por com testes a alterar as configurações, resolvi colocar no meu servidor.

A direfença é abismal como era de esperar. Passou de 10minutos para 1 segundo (se tanto)

Obrigado a todos pela ajuda :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.