Jump to content


Photo

Otimizar Tempo Ao Gravar No Mysql


  • Faça o login para participar
2 replies to this topic

#1 Magic Angel

Magic Angel

    Turista

  • Usuários
  • 59 posts
  • Sexo:Feminino

Posted 31/10/2008, 09:57

Tenho aqui um duas tabelas no Mysql.. uma que grava os campos de um form, e outra q grava o preenchimento destes campos.

Explico:
tabela campos do form:
o administrador escolhe quantos campos o form vai ter, e escolhe que tipo será cada campo (text, radio, select, etc)
gravo na tabela um novo registro para cada novo campo do form, com seu respectivo tipo, tudo num mesmo id para eu saber que se trata do mesmo form.

tabela preenchimento dos campos:
o usuário enxerga os forms disponíveis para preencher, escolhe um, e preenche os campos desse form
seleciono o id do form q o user escolheu, e faço um while na tabela campos do form para ver quantos campos foram criados para aquele form, e mostro-os na tela.
o usuário preenche e eu gravo um novo registro pra cada campo novo do form, com o id do usuário, o id do campo na tabela campos do form, e o id do form.

O meu problema é que demora muito para ele rodar o while na hora de gravar os campos preenchidos pelo usuário, ultrapassando 90 segundos. Talvez demore muito mesmo quando são 6 campos no form, ou seja, 6 registro pra gravar... mas eu não queria fazer a gambiarra de criar um nº X, máximo de campos do form, e gravar tudo num registro só, com uma tabela com várias colunas.
Queria algo mais dinâmico, assim como estou fazendo... só que também não pode levar todo esse tempo pra gravar.
E agora?

Anexo: (gravando na tabela de preenchimento do form)
$j=1;
	while ($j <= $quant)
	{
		mysql_query("INSERT INTO inscricoes (
		id_instituicao,
		id_inscrito,
		id_evento,
		id_campo,
		campo,
		tipo,
		data
		) VALUES (
		'$id_instituicao',
		'$id_inscrito',
		'$id_evento',
		'".$_POST['id_campo'.$j]."',
		'".$_POST['campo'.$j]."',
		'".$_POST['tipo'.$j]."',
		NOW()
		)");
	}


Obrigada desde já!
O mundo é grande, O mundo é grande e cabe,
nesta janela sobre o mar, o mar é grande e cabe,
Na cama e no colchão de amar, o amor é grande e cabe,
no breve espaço de beijar.

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 31/10/2008, 14:06

Você tem uma modelagem complicada nas mãos :ponder:

Ficou um pouco complicado de entender só com o INSERT, mas pelo que eu entendi você pode tomar duas medidas:
Primeiro: esse while sempre vai ser lento porque, pelo que percebi, você seleciona tudo e filtra nesse WHILE...
Refaça sua query com um WHERE filtrando apenas os campos do teu form. Dessa maneira você vai fazer um while apenas com os campos que interessam ;)
Um filtro de WHERE é MUITO mais rápido do que fazer isso por WHILE em PHP...

A segunda coisa é que, pelo que entendi, você envia um INSERT por vez, quando poderia fazer isso enviando um bloco de uma vez só, no final do while ou, melhor ainda, salvar em um arquivo texto e importar com LOAD DATA do MySQL...

O ganho de performance só aí será bastante significante (y)

#3 Magic Angel

Magic Angel

    Turista

  • Usuários
  • 59 posts
  • Sexo:Feminino

Posted 31/10/2008, 16:40

desculpe.. vou ser mais específica...
eu já filtro o máximo que posso... funciona basicamente dessa maneira...

trecho de busca:
case 1:

	$i = 1;
	echo "<br><br>
	<a href='inscricoes.php?id=$id&id_associada=$id_associada'>« Voltar »</a>
	<form method=\"post\" action=\"inscricoes.php?id=$id&id_associada=$id_associada&op=3\">
	<div class=\"conteudo\">";
	
	$sql = "SELECT * FROM fichas WHERE id_evento=".$id_evento." ORDER BY id ASC";
	$resultado = mysql_query($sql)
	or die ("Não foi possível realizar a consulta.");
	
	while ($linha=mysql_fetch_array($resultado))
	{
		$grava=$grava."<input type=\"hidden\" name=\"id_campo".$i."\" value=\"".$linha['id']."\">
		<input type=\"hidden\" name=\"campo".$i."\" value=\"campo".$i."\">
		<br><br><label for=\"campo".$i."\">".$linha['campo']."</label><br>";
		
		if ($linha['tipo'] == 2)
		{
			$grava=$grava."<input name=\"tipo".$i."\" size=\"70\" value=\"\" type=\"text\">";
		}
		if ($linha['tipo'] == 3)
		{
			$grava=$grava."<input name=\"tipo".$i."\" value=\"Sim\" type=\"radio\">Sim
			<input name=\"tipo".$i."\" value=\"Não\" type=\"radio\">Não";
		}
		if ($linha['tipo'] == 4)
		{
			$grava=$grava."<input name=\"tipo".$i."\" size=\"70\" value=\"\" type=\"text\">
		}
		$i++;
	}
	$grava=$grava."<input type=\"hidden\" name=\"quant\" value=\"".$i."\">
	<br><br><input type=\"submit\" value=\"« Enviar »\"></div></form>";
	
	echo $grava;

	break;

e depois coloco o while.. se não houver o while, eu teria que estipular um nº máximo de campos, e tudo num registro só.. no caso, vamos stipular o nº máximo como 8, assim:
$sql=mysql_query("INSERT INTO inscricoes (
	id_instituicao,
	id_inscrito,
	id_evento,
	id_campo1,
	campo1,
	tipo1,
	id_campo2,
	campo2,
	tipo2,
	id_campo3,
	campo3,
	tipo3,
	id_campo4,
	campo4,
	tipo4,
	id_campo5,
	campo5,
	tipo5,
	id_campo6,
	campo6,
	tipo6,
	id_campo7,
	campo7,
	tipo7,
	id_campo8,
	campo8,
	tipo8,
	data
	) VALUES (
	'$id_instituicao',
	'$id_inscrito',
	'$id_evento',
	'".$_POST['id_campo1']."',
	'".$_POST['campo1']."',
	'".$_POST['tipo1']."',
	'".$_POST['id_campo2']."',
	'".$_POST['campo2']."',
	'".$_POST['tipo2']."',
	'".$_POST['id_campo3']."',
	'".$_POST['campo3']."',
	'".$_POST['tipo3']."',
	'".$_POST['id_campo4']."',
	'".$_POST['campo4']."',
	'".$_POST['tipo4']."',
	'".$_POST['id_campo5']."',
	'".$_POST['campo5']."',
	'".$_POST['tipo5']."',
	'".$_POST['id_campo6']."',
	'".$_POST['campo6']."',
	'".$_POST['tipo6']."',
	'".$_POST['id_campo7']."',
	'".$_POST['campo7']."',
	'".$_POST['tipo7']."',
	'".$_POST['id_campo8']."',
	'".$_POST['campo8']."',
	'".$_POST['tipo8']."',
	NOW()
	)");

usando o while, posso ter quantos campos eu quiser, e não vou ocupar memória, gravando nulo em campos desnecessários.. o-o
O mundo é grande, O mundo é grande e cabe,
nesta janela sobre o mar, o mar é grande e cabe,
Na cama e no colchão de amar, o amor é grande e cabe,
no breve espaço de beijar.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq