|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
|
Back to top |
|
migas Smarty Regular
Joined: 07 Apr 2004 Posts: 73 Location: Porto, Portugal
|
Posted: Thu Sep 13, 2007 4:12 pm Post subject: |
|
|
Estive a ver esse artigo mas não o li todo e daquilo que pude entender é q faz um SELECT global da base de dados e depois retira os elementos fora da página em questão.
A performance de este processo é boa caso tenha poucos elementos na base de dados com + de 1000 elementos a listagem torna-se demorada.
O smarty paginate embora seja mais elaborado prevem o uso de uma base de dados mais preenchida. |
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Sat Sep 15, 2007 4:29 am Post subject: negativo |
|
|
Se ler mais atentamente verá que ele fara um select digamos pela descrição da busca... mas limitara com o limit... trazendo apenas o que necessita, como por exemplo 10 produtos por página...
O Select não seria global, seria aonde vc quer buscar os dados, mas ele nao vai trazer tudo... o limit nao recolhe tudo, ele já analisa a tabela limitando a quantidade... se vc tem 10000 produtos e limita a 10 na busca com o limit ele so vai buscar esse 10 primeiros, veja no site do mysql e analise novamente o codigo baseado no que lhe falei agora e me de uma resposta |
|
Back to top |
|
migas Smarty Regular
Joined: 07 Apr 2004 Posts: 73 Location: Porto, Portugal
|
Posted: Thu Sep 20, 2007 1:35 pm Post subject: Re: negativo |
|
|
doido wrote: | Se ler mais atentamente verá que ele fara um select digamos pela descrição da busca... mas limitara com o limit... trazendo apenas o que necessita, como por exemplo 10 produtos por página...
O Select não seria global, seria aonde vc quer buscar os dados, mas ele nao vai trazer tudo... o limit nao recolhe tudo, ele já analisa a tabela limitando a quantidade... se vc tem 10000 produtos e limita a 10 na busca com o limit ele so vai buscar esse 10 primeiros, veja no site do mysql e analise novamente o codigo baseado no que lhe falei agora e me de uma resposta |
Exemplo 1:
Code: |
$sql="SELECT * FROM artigo";
$rs = mysql_query($sql);
$num_total_registos = mysql_num_rows($rs);
|
Linhas Artigos: 20821
Tempo de Execução: 0.31251 segundos
Exemplo 2:
Code: |
$sql="SELECT COUNT(*) AS total FROM artigo";
$rs = mysql_query($sql);
...
$num_total_registos = $resultado[total];
|
Linhas Artigos: 20821
Tempo de Execução: 0.00192 segundos |
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Sat Sep 22, 2007 2:04 pm Post subject: ??? |
|
|
Certo amigo... no primeiro vc retornou todos os registros da tabela e no outro só retornou a contagem... lógico que o primeiro demorou mais...
Mas o que isso tem a ver com o que eu lhe falei????
Já que conhece o microtime faça o teste com o limit... vc pode ter 300 milhoes de registro... se vc der um limit 0, 10 ele só vai retornar os 10 primeiro... se tu der um limit 11,20 só vai retornar do 11º ao 20º e assim vai filhao... testa ai e me fala
OBS... foi mal a demora, tava sumido ai |
|
Back to top |
|
migas Smarty Regular
Joined: 07 Apr 2004 Posts: 73 Location: Porto, Portugal
|
Posted: Mon Sep 24, 2007 9:55 am Post subject: |
|
|
Quando me referi aos tempos de cada um dos procedimentos estava só a tentar exemplificar que o modelo dado na página com a paginação tem uma falha de performance nesse ponto, ou seja, no calculo do total de registos.
A performance do limit deverá ser a mesma pois o SQL será igual.
|
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Mon Sep 24, 2007 1:27 pm Post subject: |
|
|
assim... realmente é verdade... mas tirando a contagem dos registros o resto parece filé... o q tu axa??? |
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Mon Sep 24, 2007 4:18 pm Post subject: ... |
|
|
entao o jeito é usar o SmartyPaginate... conseguiu pensar em alguma outra forma de se livrar dessa falha???
Pois eu dou o seguinte SELECT em meu projeto:
"SELECT P.id_fornecedor, P.id_produto, P.descricao, P.valor, P.unidade, F.id_fornecedor, F.bairro, F.cidade FROM produtos P, fornecedor F where P.descricao like '%".$_GET['descricao']."%' AND P.id_fornecedor = F.id_fornecedor"
ao tentar incluir o seu COUNT(*) AS total para tentar me livrar do problema do mysql_num_rows como em:
"SELECT P.id_fornecedor, P.id_produto, P.descricao, P.valor, P.unidade, F.id_fornecedor, F.bairro, F.cidade, COUNT(*) AS total FROM produtos P, fornecedor F where P.descricao like '%".$_GET['descricao']."%' AND P.id_fornecedor = F.id_fornecedor"
Só fico recebendo erro de sintaxe... de uma analisada no meu código ai... que tu diz, onde estou pecando??? |
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
|
Back to top |
|
migas Smarty Regular
Joined: 07 Apr 2004 Posts: 73 Location: Porto, Portugal
|
Posted: Tue Sep 25, 2007 12:02 am Post subject: |
|
|
eu criei uma função que me gera objectos de uma base de dados automaticamente desta forma sempre que eu necessito de criar uma paginação é mais facil.
Code: |
function GetPage($pageNum=1,$rowsPerPage=10)
{
if(!$pageNum) $pageNum =1;
$startRow = ($pageNum - 1) * $rowsPerPage;
$stopRow = $startRow + $rowsPerPage;
$sql="SELECT COUNT(*) AS total FROM dominio";
$result = mysql_query($sql);
if($row = mysql_fetch_array($result))
$totalRows = $row["Total"];
$sql="SELECT * FROM dominio LIMIT ".$startRow.",".$rowsPerPage;
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)) $rows[] = $row;
$Rarray[result] = $rows;
$Rarray[paginate]["page"] = $pageNum;
$Rarray[paginate]["count"] = ceil($totalRows / $rowsPerPage);
return $Rarray;
}
$return_result = GetPage($_GET["pagina"],20);
$smarty->assign("items_do_sql",$return_result[result]);
$smarty->assign("paginacao",$return_result[paginate]);
|
Esta função retorna 1 array com duas dimensões
1 - os resultados que foram filtrados
2 - os valores que necessito para criar uma paginação
2.1 - {$paginacao.page} = pagina actual seleccionada
2.2 - {$paginacao.count} = quantas paginas são necessarias
com um tpl simples podera ser facil criar uma paginação
Code: |
{section name="secp" loop=$paginacao.count}
{if $paginacao.iteration == $paginacao.page}<b>{/if}
{$paginacao.iteration}
{if $paginacao.iteration == $paginacao.page}</b>{/if}
{/section}
|
|
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Tue Sep 25, 2007 3:15 pm Post subject: |
|
|
função interessante... mas no meu caso eu fiz um código mesmo aproveitando explicacoes daquele link que lhe passei e fazendo as melhorias do count conforme vc me alertou...
Não estou sentindo diferença... mas creio que seja por estar com o banco praticamente zerado agora... visto que estou a criar o site a apenas 1 mes...
Gostaria que visualizasse o código de minhas página de pesquisa antes e depois e visse se fiz corretamente as mudanças e se existe mais alguma forma de otimizar o meu código, pois devo ter em torno de 1 milhao de registros na minha tabela produtos, da qual efetuo as pesquisa...
OBS: repare q no exemplo antes faço uma busca direta nas tabelas produtos e fornecedor... o motivo pode ser visto em meu site www.mordomiaemcasa.com.br, pesquise por "coca" por exemplo, hj vai lhe retornar 2 resultados da mesma empresa. basicamente quando alguem pesquisa é retornado informações de produtos da pesquisa e informações das empresas que os vendem... minha dúvida é... deixo como no primeiro exemplo (busca direta nas 2 tabelas) ou no segundo (que busca primeiro no produtos e depois em fornecedor)????? o segundo arquivo é que estou usando, pois otimizei ele com o lance do count... abços amigo
Alterações de um para o outro em negrito
PRIMEIRO ARQUIVO
<?
session_start();//inicia o uso de sessoes
include ("configuracao.php"); //inclui a configuracao na jogada
require("setup.php");
$smarty = new Smarty_Mordomia();
$start = microtime(1);
$seed=$_SESSION['aleatorio'];
if($_GET['descricao']!=""){//checa se foi digitado algo na pesquisa para proseguir
$pag_views=10; //Precisamos informar quantas linhas/registros do banco queremos mostrar, sendo assim;
If (!$pagina) {
$pagina = 1;
}
else { //Agora vamos a um pequeno processo para evitar a página 0
$pagina = $pagina; //, isso é para que visualmente não fique confusa uma interpretação do número da página:
}
//Vamos calcular o valor da variável $inicio, essa variável é quem vai dizer onde o MySQL vai começar a capturar linhas;
$mat = $pagina -1; //ASSIM INICIAREMOS DA LINHA ZERO DO BANCO
$inicio = $mat * $pag_views;
$conexao=mysql_connect($host,$login_db,$senha_db); //loga ao servidor
mysql_select_db($database,$conexao); //conecta ao banco
$sql= "SELECT P.id_fornecedor, P.id_produto, P.descricao, P.valor, P.unidade, F.razao, F.id_fornecedor, F.endereco, F.bairro, F.cidade, F.uf, F.ddd, F.telefone, F.obs_fornecedor FROM produtos P, fornecedor F where P.descricao like '%".$_GET['descricao']."%' AND P.id_fornecedor = F.id_fornecedor"; //fazer a pesquisa de todos os dados atraves da variavel descricao enviada via get
$resultado=mysql_query($sql,$conexao);//executa a pesquisa (query) if($_GET['bairro']!=""){
$sql .= " AND F.bairro = '".$_GET['bairro']."'";
}
if($_GET['cidade']!=""){
$sql .= " AND F.cidade = '".$_GET['cidade']."'";
}
if ($_GET['ordem']=="menor"){
$limita = "$sql ORDER BY P.valor LIMIT $inicio,$pag_views";
}
else if ($_GET['ordem']=="maior"){
$limita = "$sql ORDER BY P.valor DESC LIMIT $inicio,$pag_views";
}
else{
$limita = "$sql ORDER BY RAND($seed) LIMIT $inicio,$pag_views";
}
$executa = mysql_query($limita); //executa a pesquisa limitada
$linhas = mysql_num_rows($resultado);//linhas recebe a qtde de dados gerais existentes $paginas = $linhas / $pag_views;
if($linhas!=0){ //checa se tem dados validos
$x=1; //inicia um contador
while ($linha = mysql_fetch_array($executa)) {//percorre a lista dos dados da pesquisa limitada
$razao=$linha['id_fornecedor'];//atribui o ID do fornecedor da tabela produto a variavel razao
$sidproduto[]=$linha['id_produto'];
$sdescricao[]=$linha['descricao'];
$svalor[]=moeda($linha['valor']);
$srazao[]=$linha['razao'];
$sendereco[]=$linha['endereco'];
$sbairro[]=$linha['bairro'];
$scidade[]=$linha['cidade'];
$suf[]=$linha['uf'];
$sddd[]=$linha['ddd'];
$stelefone[]=$linha['telefone'];
$sobs_fornecedor[]=$linha['obs_fornecedor'];
}
$paginasdepaginacao="";
for($i=0;$i<$paginas;$i++){//REPETE ATÉ QUE SE ACABEM AS PAGINAS
$pag = $i +1; //EVITA A PÁGINA ZERO
$paginasdepaginacao = $paginasdepaginacao . "<td width='10%' valign=bottom nowrap><font size='2' face='Arial, Helvetica, sans-serif'><a href='pesquisa.php?pagina=".$pag."&descricao=".$_GET['descricao']."'>".$pag."</a></font></td>";
}
}
mysql_close($conexao);//encerra conexao com o banco de dados
$smarty->assign('paginasdepaginacao', $paginasdepaginacao);
$smarty->assign('descricao', $_GET['descricao']);
$smarty->assign('sidproduto', $sidproduto);
$smarty->assign('sdescricao', $sdescricao);
$smarty->assign('svalor', $svalor);
$smarty->assign('srazao', $srazao);
$smarty->assign('sendereco', $sendereco);
$smarty->assign('sbairro', $sbairro);
$smarty->assign('scidade', $scidade);
$smarty->assign('suf', $suf);
$smarty->assign('sddd', $sddd);
$smarty->assign('stelefone', $stelefone);
$smarty->assign('sobs_fornecedor', $sobs_fornecedor);
$smarty->assign('linhas', $linhas);
$smarty->assign('inicio', $inicio);
$smarty->assign('paginas', $linhas / $pag_views);//paginas recebe o numero de paginas por 10 dos dados gerais
$smarty->assign('linha',mysql_fetch_array($executa));
$end = microtime(1);
$ctime = $end - $start;
if($linhas!=0){ //checa se tem dados validos
$smarty->assign('respostaresultado',"Resultados ".($inicio+1)." - ".(mysql_num_rows($executa)+$inicio)." de um total de ".$linhas." para <span class='bold'>".$_GET['descricao']."</span> (".sprintf ( "%02.4f", $ctime ).")segundos");
}
else{
$smarty->assign('respostaresultado', "Nenhum resultado para <span class='bold'>".$_GET['descricao']."</span> foi encontrado");
}
$smarty->display('pesquisa.html');
}
?>
SEGUNDO ARQUIVO
<?
session_start();//inicia o uso de sessoes
include ("configuracao.php"); //inclui a configuracao na jogada
require("setup.php");
$smarty = new Smarty_Mordomia();
$start = microtime(1);
$seed=$_SESSION['aleatorio'];
if($_GET['descricao']!=""){//checa se foi digitado algo na pesquisa para proseguir
$pag_views=10; //Precisamos informar quantas linhas/registros do banco queremos mostrar, sendo assim;
If (!$pagina) {
$pagina = 1;
}
else { //Agora vamos a um pequeno processo para evitar a página 0
$pagina = $pagina; //, isso é para que visualmente não fique confusa uma interpretação do número da página:
}
//Vamos calcular o valor da variável $inicio, essa variável é quem vai dizer onde o MySQL vai começar a capturar linhas;
$mat = $pagina -1; //ASSIM INICIAREMOS DA LINHA ZERO DO BANCO
$inicio = $mat * $pag_views;
$conexao=mysql_connect($host,$login_db,$senha_db); //loga ao servidor
mysql_select_db($database,$conexao); //conecta ao banco
$sql= "SELECT id_fornecedor, id_produto, descricao, valor, unidade FROM produtos where descricao like '%".$_GET['descricao']."%'"; //fazer a pesquisa de todos os dados atraves da variavel descricao enviada via get
$sqlcount="SELECT COUNT(*) as total FROM produtos where descricao like '%".$_GET['descricao']."%'"; if($_GET['bairro']!=""){
$sql .= " AND F.bairro = '".$_GET['bairro']."'";
}
if($_GET['cidade']!=""){
$sql .= " AND F.cidade = '".$_GET['cidade']."'";
}
if ($_GET['ordem']=="menor"){
$limita = "$sql ORDER BY valor LIMIT $inicio,$pag_views";
}
else if ($_GET['ordem']=="maior"){
$limita = "$sql ORDER BY valor DESC LIMIT $inicio,$pag_views";
}
else{
$limita = "$sql ORDER BY RAND($seed) LIMIT $inicio,$pag_views";
}
$resultcontagem = mysql_query($sqlcount,$conexao);
$executa = mysql_query($limita,$conexao); //executa a pesquisa limitada
if($row = mysql_fetch_array($resultcontagem))
$linhas = $row['total'];
$paginas = $linhas / $pag_views;
if($linhas!=0){ //checa se tem dados validos
$x=1; //inicia um contador
while ($linha = mysql_fetch_array($executa)) {//percorre a lista dos dados da pesquisa limitada
$razao=$linha['id_fornecedor'];//atribui o ID do fornecedor da tabela produto a variavel razao
$sql="SELECT * FROM fornecedor where id_fornecedor = '$razao'";//vai buscar dados do fornecedor atraves dessa ID
$resultado2=mysql_query($sql,$conexao);//executa a busca os dados
$linhauser=mysql_fetch_array($resultado2);//captura o resultado da linha resultante da busca
$sidproduto[]=$linha['id_produto'];
$sdescricao[]=$linha['descricao'];
$svalor[]=moeda($linha['valor']);
$srazao[]=$linhauser['razao'];
$sendereco[]=$linhauser['endereco'];
$sbairro[]=$linhauser['bairro'];
$scidade[]=$linhauser['cidade'];
$suf[]=$linhauser['uf'];
$sddd[]=$linhauser['ddd'];
$stelefone[]=$linhauser['telefone'];
$sobs_fornecedor[]=$linhauser['obs_fornecedor'];
}
$paginasdepaginacao="";
for($i=0;$i<$paginas;$i++){//REPETE ATÉ QUE SE ACABEM AS PAGINAS
$pag = $i +1; //EVITA A PÁGINA ZERO
$paginasdepaginacao = $paginasdepaginacao . "<td width='10%' valign=bottom nowrap><font size='2' face='Arial, Helvetica, sans-serif'><a href='pesquisa.php?pagina=".$pag."&descricao=".$_GET['descricao']."'>".$pag."</a></font></td>";
}
}
mysql_close($conexao);//encerra conexao com o banco de dados
$smarty->assign('paginasdepaginacao', $paginasdepaginacao);
$smarty->assign('descricao', $_GET['descricao']);
$smarty->assign('sidproduto', $sidproduto);
$smarty->assign('sdescricao', $sdescricao);
$smarty->assign('svalor', $svalor);
$smarty->assign('srazao', $srazao);
$smarty->assign('sendereco', $sendereco);
$smarty->assign('sbairro', $sbairro);
$smarty->assign('scidade', $scidade);
$smarty->assign('suf', $suf);
$smarty->assign('sddd', $sddd);
$smarty->assign('stelefone', $stelefone);
$smarty->assign('sobs_fornecedor', $sobs_fornecedor);
$smarty->assign('linhas', $linhas);
$smarty->assign('inicio', $inicio);
$smarty->assign('paginas', $linhas / $pag_views);//paginas recebe o numero de paginas por 10 dos dados gerais
$smarty->assign('linha',mysql_fetch_array($executa));
$end = microtime(1);
$ctime = $end - $start;
if($linhas!=0){ //checa se tem dados validos
$smarty->assign('respostaresultado',"Resultados ".($inicio+1)." - ".($linhas+$inicio)." de um total de ".$linhas." para <span class='bold'>".$_GET['descricao']."</span> (".sprintf ( "%02.4f", $ctime ).")segundos");
}
else{
$smarty->assign('respostaresultado', "Nenhum resultado para <span class='bold'>".$_GET['descricao']."</span> foi encontrado");
}
$smarty->display('pesquisa.html');
}
?> |
|
Back to top |
|
doido Smarty Rookie
Joined: 11 Sep 2007 Posts: 13
|
Posted: Tue Sep 25, 2007 3:42 pm Post subject: ... |
|
|
Caso esteja tudo ok... pensei em outra coisa... nós poderiamos jogar o count numa variavel de sessão para não termos que toda vez que dar o limit fazer a contagem geral, exceto pela primeira vez |
|
Back to top |
|
migas Smarty Regular
Joined: 07 Apr 2004 Posts: 73 Location: Porto, Portugal
|
Posted: Fri Sep 28, 2007 9:55 pm Post subject: |
|
|
Só tentei limpar o primeiro ficheiro tentei também simplificar as operações.
Code: |
<?
session_start();//inicia o uso de sessoes
include ("configuracao.php"); //inclui a configuracao na jogada
require("setup.php");
$smarty = new Smarty_Mordomia();
$start = microtime(1);
$seed=$_SESSION['aleatorio'];
if($_GET['descricao'])
{ //checa se foi digitado algo na pesquisa para proseguir
$pag_views=10; //Precisamos informar quantas linhas/registros do banco queremos mostrar, sendo assim;
$conexao=mysql_connect($host,$login_db,$senha_db); //loga ao servidor
mysql_select_db($database,$conexao); //conecta ao banco
# Total de registos na BD
$sql= "SELECT COUNT(*) AS total FROM produtos P, fornecedor F where P.descricao like '%".$_GET['descricao']."%' AND P.id_fornecedor = F.id_fornecedor";
$resultado=mysql_query($sql,$conexao); //executa a pesquisa (query)
if( $linha = mysql_fetch_array($executa)) $linhas = $linha["total"];
if(!$pagina) $pagina =1;
$pag_start = ($pagina - 1) * $pag_views;
$pag_stop = $pag_start + $pag_views;
$paginas = ceil($linhas / $pag_views);
$sql= "SELECT
P.id_fornecedor,
P.id_produto,
P.descricao,
P.valor,
P.unidade,
F.razao,
F.id_fornecedor,
F.endereco,
F.bairro,
F.cidade,
F.uf,
F.ddd,
F.telefone,
F.obs_fornecedor
FROM produtos P, fornecedor F
WHERE
P.descricao like '%".$_GET['descricao']."%' AND
P.id_fornecedor = F.id_fornecedor";
if($_GET['bairro']) $sql .= " AND F.bairro = '".$_GET['bairro']."'";
if($_GET['cidade']) $sql .= " AND F.cidade = '".$_GET['cidade']."'";
# Limites
if($_GET['ordem'] =="menor") $limita = $sql." ORDER BY P.valor LIMIT $pag_start,$pag_stop";
elseif ($_GET['ordem']=="maior") $limita = $sql." ORDER BY P.valor DESC LIMIT $pag_start,$pag_stop";
else $limita = $sql." ORDER BY RAND($seed) LIMIT $pag_start,$pag_stop";
$executa = mysql_query($limita); //executa a pesquisa limitada
while ($linha = mysql_fetch_array($executa)) $resultados_linhas[] = $linha;
$paginasdepaginacao="";
for($i=0;$i<$paginas;$i++){//REPETE ATÉ QUE SE ACABEM AS PAGINAS
$pag = $i++; //EVITA A PÁGINA ZERO
$paginasdepaginacao .= "<td width='10%' valign=bottom nowrap><font size='2' face='Arial, Helvetica, sans-serif'><a href='pesquisa.php?pagina=".$pag."&descricao=".$_GET['descricao']."'>".$pag."</a></font></td>";
}
mysql_close($conexao);//encerra conexao com o banco de dados
$smarty->assign('paginasdepaginacao', $paginasdepaginacao);
$smarty->assign('descricao', $_GET['descricao']);
$smarty->assign('resultados', $resultados_linhas);
/*
{section name=r loop=$resultados}
<h1>{$resultados[r].sdescricao|upper}</h1>
<label>Valor: {$resultados[r].svalor|upper}</label>
...
{/section}
*/
$smarty->assign('linhas', $linhas);
$smarty->assign('inicio', $inicio);
$smarty->assign('paginas', $paginas);//paginas recebe o numero de paginas por 10 dos dados gerais
$smarty->assign('linha',mysql_fetch_array($executa));
$end = microtime(1);
$ctime = $end - $start;
if($linhas!=0){ //checa se tem dados validos
$smarty->assign('respostaresultado',"Resultados ".($inicio+1)." - ".(mysql_num_rows($executa)+$inicio)." de um total de ".$linhas." para <span class='bold'>".$_GET['descricao']."</span> (".sprintf ( "%02.4f", $ctime ).")segundos");
}
else{
$smarty->assign('respostaresultado', "Nenhum resultado para <span class='bold'>".$_GET['descricao']."</span> foi encontrado");
}
$smarty->display('pesquisa.html');
}
?>
|
|
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|
|