Ir para conteúdo
Fórum Script Brasil
  • 0

Como posso melhorar desempenho da consulta


Helio Cesar

Pergunta

Ola a todos, estou trabalhando com o phpmyadmin e fiz uma consulta que retorna os dados dos produtos por usuário, resumindo tenho 5 tabelas, produto, pedido, item_pedido, item_pedido_preco, e usuarios a minha consulta esta demorando em torno de 1 minuto para retornar queria ver se algem tem alguma ideia para melhorar o desempenho, ficar mais rapido, segue as informações de cada tabela.

 

tabela                      |  quantidade de informações

pedido                     = 1

item_pedido            = 350

usuarios                  = 9

item_pedido_preco = 3150

 

abaixo segue o sql, estou trabalhando com PHP.

private function itemprecofinalizado(){
  ini_set('max_execution_time','220');//estou aumenta o tempo de execucao pis a consulta esta muito lenta
  if($this->get_request_method() != "GET"){
	$this->response('',406);
   }
$id =(int)$this->_request['id'];
	if($id > 0){

//inicio conexao com o banco
            $DB_HOST = "localhost";
            $DB_NAME = "banco";
            $DB_PORTA = "3306";
            $DB_USER = "root";
            $DB_PASS = "root";

            $conexao = mysql_connect($DB_HOST,$DB_USER,$DB_PASS) or die ("Erro na Conexão!");
            $db = mysql_select_db($DB_NAME, $conexao) or die ("Erro na Conexão!");
//fim conexao com o banco

            //PEGA TODOS OS ITENS REFERENTE AO PEDIDO
            $sqlProduto = mysql_query("SELECT * FROM item_pedido i INNER JOIN produto p ON i.id_produto = p.prod_id WHERE i.id_pedido = '".$id."' ORDER BY p.prod_descricao") or die (mysql_error());
            $quantProduto = mysql_num_rows($sqlProduto);
            if($quantProduto > 0 ){
                while($rowItem = mysql_fetch_array($sqlProduto)){
                    $duplicidade = 0;//verifica preco em duplicidade

                    $id_pedido          = $rowItem['id_pedido'];
                    $id_prod		    = $rowItem['id_produto'];
                    $prod_qtd		    = $rowItem['item_qtd'];
                    $prod_descricao	    = $rowItem['prod_descricao'];
                    $prod_unidade	    = $rowItem['prod_unidade'];
                    $prod_embalagem	    = $rowItem['prod_embalagem'];

//INICIO essa parte so pega o menor preco de cada item na tabela item_pedido_preco para depois fazer a comparacao
                    $sqlMenor = mysql_query("SELECT min(item_vl_imposto) FROM item_pedido_preco r WHERE r.id_pedido ='".$id."' AND r.id_produto ='".$id_prod."' and r.item_vl_imposto != 0") or die (mysql_error());
                    $rowMenor = mysql_fetch_assoc($sqlMenor);
                    $menor = str_replace('.',',', $rowMenor['min(item_vl_imposto)']);
//FIM MENOR VALOR

//INICIO BUSCA TODOS OS USUARIOS DA TABELA E EM CADA UM DELES COLOCA TODOS OS ITENS, MESMO OS QUE ELES NAO COTAO
                    $sqlUsuario = mysql_query("SELECT * FROM usuarios WHERE usu_nivel = 1 and usu_status = 1 ORDER BY usu_id") or die (mysql_error());
                    $quantUsuario = mysql_num_rows($sqlUsuario);
                    if($quantUsuario > 0){
                        while($rowUsu = mysql_fetch_array($sqlUsuario)){
                            $usu_id = $rowUsu['usu_id'];

//INICIO PRODUTO, USUARIO, E PEGAR OS PRECOS DE TODOS OS ITENS CONFORME INFORMACAO ACIMA
                            $sqlPreco = mysql_query("SELECT * FROM item_pedido_preco WHERE id_pedido ='".$id."' AND id_produto ='".$id_prod."' AND id_usuario= '".$usu_id."' ORDER BY id_usuario") or die (mysql_error());
                            $quantPreco = mysql_num_rows($sqlPreco);
                            if($quantPreco > 0){
                                while($rowPreco = mysql_fetch_array($sqlPreco)) {

                                    $id_usuario		    = $rowUsu['usu_id'];
                                    $item_vl_anterior   = str_replace('.',',',$rowPreco['item_vl_imposto']);
                                    $item_vl_imposto    = str_replace('.',',',$rowPreco['item_vl_imposto']);
                                    $usu_titulo		    = $rowUsu['usu_titulo'];
                                    $usu_imposto        = $rowUsu['usu_imposto'];

                                    if($rowPreco['item_vl_unit'] == 0 or $rowPreco['item_vl_unit'] == NULL):
                                        $resultproduto[] = array(
                                            'id_usuario' => $id_usuario,
                                            'item_vl_imposto' => "-",
                                            'item_vl_anterior' => "-",
                                            'usu_titulo' => $usu_titulo,
                                            'usu_imposto' => $usu_imposto
                                        );
                                    else:
                                        $resultproduto[] = array(
                                            'id_usuario' => $id_usuario,
                                            'item_vl_imposto' => $item_vl_imposto,
                                            'item_vl_anterior' => $item_vl_anterior,
                                            'usu_titulo' => $usu_titulo,
                                            'usu_imposto' => $usu_imposto
                                        );
                                        if($item_vl_imposto == $menor):
                                            $duplicidade = $duplicidade+1;
                                        endif;
                                    endif;
                                }//while item_preco
                            }else{//se nao tiver no item_preco
                                $id_usuario		    = $usu_id;
                                $item_vl_anterior   = "NULL";
                                $item_vl_imposto    = "NULL";
                                $usu_titulo		    = $rowUsu['usu_titulo'];
                                $usu_imposto        = $rowUsu['usu_imposto'];

                                $resultproduto[] = array(
                                    'id_usuario' => $id_usuario,
                                    'item_vl_imposto' => $item_vl_imposto,
                                    'item_vl_anterior' => $item_vl_anterior,
                                    'usu_titulo' => $usu_titulo,
                                    'usu_imposto' => $usu_imposto
                                );
                            }//FIM
                        }//while usuario
                    }
                    //FIM
                    if($duplicidade > 1)://informa qual item esta com preco em duplicidade
                        $prod_repeat = '*';
                    else:
                        $prod_repeat = '';
                    endif;

                    $result[] = array(
                        'id_pedido' => $id_pedido,
                        'id_produto' => $id_prod,
                        'prod_qtd' => $prod_qtd,
                        'prod_descricao' => $prod_descricao,
                        'prod_unidade' => $prod_unidade,
                        'prod_embalagem' => $prod_embalagem,
                        'item_vl_unit' => $resultproduto,
                        'itemmenorpreco' => $menor,
                        'prod_repeat' => $prod_repeat
                    );
                    $resultproduto = "";
                }//while item_pedido
                $this->response($this->json($result), 200);
            }
            $this->response('',204);
        }
}

segue abaixo a imgem com o retorno da consulta.tela.thumb.png.05bcc0e11ee845fd2bbd1d0d4

Grato pela ajuda.

Editado por Helio Cesar
erro codigo
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Cara, colocar query dentro de loop é pedir  pra ter problema de desempenho...

Leia este meu artigo:

http://rberaldo.com.br/o-problema-do-n-mais-1/

 

Se quiser realmente ter desempenho TOP, veja: http://rberaldo.com.br/elasticsearch-servidor-busca/

 

PS: funções mysql_* estão obsoletas desde o PHP 5.5  e já foram removidas no PHP 7. Prefira usar MySQLi ou PDO. Veja mais aqui: http://rberaldo.com.br/mysql-obsoleto-php/

 

Editado por Beraldo
Link para o comentário
Compartilhar em outros sites

  • 0

Ola Beraldo desculpe a demora estava viajando, por favor de uma olhada abaixo e se o que fiz segue o padrão que você esta dizendo!!

	private function itemprecofinalizado(){
        if($this->get_request_method() != "GET"){
			$this->response('',406);
		}

		$id =(int)$this->_request['id'];
		//inicio versao em PDO
		if($id > 0){
            define( 'MYSQL_HOST', 'localhost' );
            define( 'MYSQL_USER', 'root' );
            define( 'MYSQL_PASSWORD', 'root' );
            define( 'MYSQL_DB_NAME', 'banco' );

            //melhor jeito, retorna o erro
            try
            {
                $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
            }
            catch ( PDOException $e )
            {
                echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
            }

            $sqlProduto = "SELECT * FROM item_pedido i INNER JOIN produto p WHERE i.id_pedido = '".$id."' AND i.id_produto = p.prod_id ORDER BY p.prod_descricao";
            $stmt = $PDO->prepare( $sqlProduto );
            $result1 = $stmt->execute();
            $rowItems = $stmt->fetchAll( PDO::FETCH_ASSOC );

            $quantProduto = $stmt->rowCount();
            if($quantProduto > 0 ){
                foreach ( $rowItems as $rowItem ){
                    $duplicidade = 0;//verifica preco em duplicidade

                    $id_pedido          = $rowItem['id_pedido'];
                    $id_prod		    = $rowItem['id_produto'];
                    $prod_qtd		    = $rowItem['item_qtd'];
                    $prod_descricao	    = $rowItem['prod_descricao'];
                    $prod_unidade	    = $rowItem['prod_unidade'];
                    $prod_embalagem	    = $rowItem['prod_embalagem'];

                    //INICIO essa parte so pega o menor preco de cada item na tabela item_pedido_preco
                    $sqlMenor = "SELECT min(item_vl_imposto) FROM item_pedido_preco r WHERE r.id_pedido ='".$id."' AND r.id_produto ='".$id_prod."' and r.item_vl_imposto != 0";
                    $stmt = $PDO->prepare( $sqlMenor );
                    $result2 = $stmt->execute();
                    $rowMenors = $stmt->fetchAll( PDO::FETCH_ASSOC );
                    foreach ( $rowMenors as $rowMenor){
                        $menor = str_replace('.',',', $rowMenor['min(item_vl_imposto)']);
                        //echo 'helio'.$menor;
                    }
                    //FIM MENOR VALOR

                    //INICIO BUSCA TODOS OS USUARIOS DA TABELA E EM CADA UM DELES COLOCA TODOS OS ITENS, MESMO OS QUE ELES NAO COTAO
                    $sqlUsuario = "SELECT * FROM usuarios WHERE usu_nivel = 1 and usu_status = 1 ORDER BY usu_id";
                    $stmt = $PDO->prepare( $sqlUsuario );
                    $result3 = $stmt->execute();
                    $rowUsus = $stmt->fetchAll( PDO::FETCH_ASSOC );

                    $quantUsuario = $stmt->rowCount();
                    if($quantUsuario > 0){
                        foreach ( $rowUsus as $rowUsu){
                            $usu_id = $rowUsu['usu_id'];

                            //INICIO PRODUTO, USUARIO, E PEGAR OS PRECOS DE TODOS OS ITENS CONFORME INFORMACAO ACIMA
                            $sqlPreco = "SELECT * FROM item_pedido_preco WHERE id_pedido ='".$id."' AND id_produto ='".$id_prod."' AND id_usuario= '".$usu_id."' ORDER BY id_usuario";
                            $stmt = $PDO->prepare( $sqlPreco );
                            $result4 = $stmt->execute();
                            $rowPrecos = $stmt->fetchAll( PDO::FETCH_ASSOC );

                            $quantPreco = $stmt->rowCount();
                            if($quantPreco > 0){
                                foreach ( $rowPrecos as $rowPreco){
                                    $id_usuario		    = $rowUsu['usu_id'];
                                    $item_vl_anterior   = str_replace('.',',',$rowPreco['item_vl_imposto']);
                                    $item_vl_imposto    = str_replace('.',',',$rowPreco['item_vl_imposto']);
                                    $usu_titulo		    = $rowUsu['usu_titulo'];
                                    $usu_imposto        = $rowUsu['usu_imposto'];

                                    if($rowPreco['item_vl_unit'] == 0 or $rowPreco['item_vl_unit'] == NULL):
                                        $resultproduto[] = array(
                                            'id_usuario' => $id_usuario,
                                            'item_vl_imposto' => "-",
                                            'item_vl_anterior' => "-",
                                            'usu_titulo' => $usu_titulo,
                                            'usu_imposto' => $usu_imposto
                                        );
                                    else:
                                        $resultproduto[] = array(
                                            'id_usuario' => $id_usuario,
                                            'item_vl_imposto' => $item_vl_imposto,
                                            'item_vl_anterior' => $item_vl_anterior,
                                            'usu_titulo' => $usu_titulo,
                                            'usu_imposto' => $usu_imposto
                                        );
                                        if($item_vl_imposto == $menor):
                                            $duplicidade = $duplicidade+1;
                                        endif;
                                    endif;
                                }//foreach item_preco
                            }else{//se nao tiver no item_preco
                                $id_usuario		    = $usu_id;
                                $item_vl_anterior   = "NULL";
                                $item_vl_imposto    = "NULL";
                                $usu_titulo		    = $rowUsu['usu_titulo'];
                                $usu_imposto        = $rowUsu['usu_imposto'];

                                $resultproduto[] = array(
                                    'id_usuario' => $id_usuario,
                                    'item_vl_imposto' => $item_vl_imposto,
                                    'item_vl_anterior' => $item_vl_anterior,
                                    'usu_titulo' => $usu_titulo,
                                    'usu_imposto' => $usu_imposto
                                );
                            }//FIM
                        }//foreach usuario
                    }
                    if($duplicidade > 1)://informa qual item esta com preco em duplicidade
                        $prod_repeat = '*';
                    else:
                        $prod_repeat = '';
                    endif;


                    $result[] = array(
                        'id_pedido' => $id_pedido,
                        'id_produto' => $id_prod,
                        'prod_qtd' => $prod_qtd,
                        'prod_descricao' => $prod_descricao,
                        'prod_unidade' => $prod_unidade,
                        'prod_embalagem' => $prod_embalagem,
                        'item_vl_unit' => $resultproduto,
                        'itemmenorpreco' => $menor,
                        'prod_repeat' => $prod_repeat
                    );
                    $resultproduto = "";
                }//foreach item_pedido
                $this->response($this->json($result), 200);
            }
            $this->response('',204);
        }
	}

Obrigado pela ajuda.

Editado por Helio Cesar
erro na ortografia
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...