Jump to content
Fórum Script Brasil
  • 0

Melhorar desempenho SQL


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_pedido = '".$id."' AND i.id_produto = p.prod_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.

Grato pela ajuda

 

tela.png

Edited by Helio Cesar
Imagem errada
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Por favor post apenas códigos de sql. Este é um site de MySQL e não de PHP ou outra linguagem.

Quando a sua query

SELECT * FROM item_pedido i INNER JOIN produto p ON i.id_pedido = '".$id."' AND i.id_produto = p.prod_id ORDER BY p.prod_descricao

1) Use a cláusula ON somente para o relacionamento entre tabelas. Passe o  

i.id_pedido = '".$id."' AND

Para a cláusula WHERE que é o local apropriado.

2) Verifique se existem índices para 

id_produto na tabela item_pedido ;

prod_id na tabela produto (creio que deva ser o primary key desta tabela)

prod_descricao na tabela produto (creio que deva ser unike key para esta tabela)

Link to comment
Share on other sites

  • 0

Por favor post apenas códigos de sql. Este é um site de MySQL e não de PHP ou outra linguagem.

Quando a sua query

SELECT * FROM item_pedido i INNER JOIN produto p ON i.id_pedido = '".$id."' AND i.id_produto = p.prod_id ORDER BY p.prod_descricao

1) Use a cláusula ON somente para o relacionamento entre tabelas. Passe o  

i.id_pedido = '".$id."' AND

Para a cláusula WHERE que é o local apropriado.

2) Verifique se existem índices para 

id_produto na tabela item_pedido ;

prod_id na tabela produto (creio que deva ser o primary key desta tabela)

prod_descricao na tabela produto (creio que deva ser unike key para esta tabela)

Bom dia Denis, desculpa por ter postado aq, vou para o site de PHP, muito obrigado pela atenção.

1) entendi sim, essa condição ficar sem dentro do WHERE

2) existe indice para id_produto, e id_pedido na tabela item_pedido

prod_id é prymary key

prod_descricao não é unike key

 

 

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...