Jump to content
Fórum Script Brasil
  • 0

Como posso melhorar desempenho da consulta


Helio Cesar
 Share

Question

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.

Edited by Helio Cesar
erro codigo
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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/

 

Edited by Beraldo
Link to comment
Share on other 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.

Edited by Helio Cesar
erro na ortografia
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...