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

Melhorar desempenho SQL


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

Editado por Helio Cesar
Imagem errada
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 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...