Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

guismelo

Consulta no banco de dados lenta

Recommended Posts

Eu estou com um script zend, que ele faz a seguinte chamada para função listar:

 

$this->view->anuncios = $this->_anuncios->listar($where,$qtd,$posicao,$ordenarValor,$ordenarAno,'RAND()');

 

a função listar é essa:

 

public function listar($where=NULL,$qtd=NULL,$posicao=NULL,$ordenarValor=NULL,$ordenarAno=NULL,$aleatorio=NULL,$mostrarFotoIndex=NULL)
{
include CAMINHO . "/controleDominios.php";
$select = $this->select()
->from(array('A'=>'anuncio'),array('idAnuncio','idPJ','idPF','dtCadastro'))
->join(array('V'=>'veiculo'), 'A.idVeiculo = V.idVeiculo',array('descricao','versao','renavam','preco','quilometragem','cambio','carroceria','placa','idVeiculo','numPortas','pastaDaImagem','estado','statusVei' =>'status'))
->join(array('MA'=>'marca'), 'MA.idMarca = V.idMarca',array('marca','idMarca'))
->join(array('MD'=>'modelo'), 'MD.idModelo = V.idModelo',array('modelo','idModelo'))
->join(array('COR'=>'cor'), 'COR.idCor = V.idCor',array('cor'))
->join(array('COMBUS'=>'combustivel'), 'COMBUS.idCombustivel = V.idCombustivel',array('combustivel'))
->join(array('ANO'=>'ano'), 'ANO.idAno = V.idAnoFabricacao',array('anoFabricacao' => 'ano'))
->join(array('ANO2'=>'ano'), 'ANO2.idAno = V.idAnoModelo',array('anoModelo' => 'ano'))
->join(array('TV'=>'tipoVeiculo'), 'TV.idTipoVeiculo = V.idTipoVeiculo',array('tipo'))
->joinLeft(array('PF' =>'pf'), 'PF.idPF = A.idPF',array('telPF' => 'tel','celPF' =>'cel','nomePF' =>'nome','idPF'))
->joinLeft(array('PJ'=> 'pj'), 'PJ.idPJ = A.idPJ',array('telPJ' => 'tel','celPJ' =>'cel','nomePJ' =>'nome','idPJ', 'pastaDaImagemPJ' => 'pastaDaImagem'))
->joinLeft(array('USER' =>'usuario'), 'USER.idUsuario = PF.idUsuario',array('emailPF' =>'email'))
->joinLeft(array('USER2' =>'usuario'), 'USER2.idUsuario = PJ.idUsuario',array('emailPJ' =>'email'))
->joinLeft(array('ENDE'=>'endereco'), '(ENDE.idEndereco = PF.idEndereco OR ENDE.idEndereco = PJ.idEndereco)',array('idCidade'))
->joinLeft(array('CIDA'=>'cidade'), 'CIDA.idCidade = ENDE.idCidade',array('idEstado','cidade'))
->joinLeft(array('ESTA'=>'estado'), 'ESTA.idEstado = CIDA.idEstado',array('sigla'))
->joinLeft(array('PLAN'=>'plano'), 'PLAN.idPlano = A.idPlano',array('idPlanoPF' =>'idPlano','qtdDiaPF'=>'qtdDia','planoPF' =>'plano','valorPlanoPF' =>'valor','tipoPlanoPF' =>'tipo'))
->joinLeft(array('PLAN2'=>'plano'), 'PLAN2.idPlano = A.idPlano',array('idPlanoPJ' =>'idPlano','qtdDiaPJ'=>'qtdDia','planoPJ' =>'plano','valorPlanoPJ' =>'valor','tipoPlanoPJ' =>'tipo'))
->joinLeft(array('FOTPJ'=>'foto'), 'FOTPJ.idPJ = A.idPJ',array('fotoPJ'=>'foto','dominioCadastrado'))
->joinLeft(array('PG'=>'pagamento'), 'PG.idAnuncio = A.idAnuncio')
//->joinLeft(array('PG2'=>'pagamento'), 'PG2.idPJ = PJ.idPJ')
->group('V.idVeiculo')
->order($ordenarValor)
->order($ordenarAno)
->limit($qtd,$posicao)
->setIntegrityCheck(false);
if(is_null($mostrarFotoIndex))
$select->joinLeft(array('FOT'=>'foto'), 'FOT.idVeiculo = V.idVeiculo',array('foto','dominioCadastrado'));
else
$select->join(array('FOT'=>'foto'), 'FOT.idVeiculo = V.idVeiculo',array('foto','dominioCadastrado'));
if(!is_null($aleatorio))
$select->order($aleatorio);
if(!is_null($where))
{
$select->where($where . $whereDominio);
}
else if(!empty($whereDominioSemEND))
{
$select->where($whereDominioSemEND);
}
// echo "<br>" . $select->__toString();
//exit();
return $this->fetchAll($select);
}
O problema de lentidão aparece principalmente quando usa-se o joinleft, porque o anuncio pode ser cadastrado como loja ou particular, e algum deles é nulo.
No site essa pesquisa é extremamente lenta, alguem tem alguma ideia do que está errado e como consertar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem a quantidade de comando monotonos esta prevalecendo em seu codigo, bem eu recomendaria a tentar fazer isso sem esse script do zend...E se pergunta se realmente voce vai necessitar usar o jointleft?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.