Ir para conteúdo
Guilherme Luiz

Otimização de SELECT

Recommended Posts

Olá pessoal,

 

Tenho a seguinte consulta

  $queryList  = "SELECT
    sms.id        as id,
    sms.mobile    as mobile,
    sms.ddi       as ddi,
    sms.send_date as dataEnvio,
    sms.dlr_date  as dataDlr,
    sms.status    as status,
    sms.substatus as descricao,
    sms.route     as rota,
    sms.cost      as tarifa,
    sms.currency  as moeda,
    w.flag        as flag,
    w.country     as pais,
    ctt.nome      as nome
    FROM sms_mt   as sms
    INNER JOIN worldwide as w ON w.ddi = sms.ddi
    LEFT JOIN (SELECT concat(ddi,mobile) as mobile, nome as nome FROM phonebook WHERE user_id='{$userID}') as ctt on ctt.mobile = sms.mobile
    WHERE sms.user_id='{$userID}' and sms.campaing_id='{$x['id']}'
    UNION ALL
    SELECT
    sms.id        as id,
    sms.mobile    as mobile,
    sms.ddi       as ddi,
    sms.dlr_date  as dataEnvio,
    sms.dlr_date  as dataDlr,
    sms.status    as status,
    sms.substatus as descricao,
    sms.route     as rota,
    sms.cost      as tarifa,
    sms.currency  as moeda,
    w.flag        as flag,
    w.country     as pais,
    ctt.nome      as nome
    FROM sms_mo   as sms
    INNER JOIN worldwide as w ON w.ddi = sms.ddi
    LEFT JOIN (SELECT concat(ddi,mobile) as mobile, nome as nome FROM phonebook WHERE user_id='{$userID}') as ctt on ctt.mobile = sms.mobile
    WHERE sms.user_id='{$userID}' and sms.campaing_id='{$x['id']}' and sms.billed=1
    ORDER BY dataEnvio DESC";
    $sqlList = mysqli_query($connect_sql,$queryList);
    while($list = @mysqli_fetch_assoc($sqlList)){
      $stats[] = [
        "id"        => (int)$list['id'],
        "mobile"    => $list['mobile'],
        "flag"      => "/includes/images/flags/{$list['flag']}.png",
        "ddi"       => $list['ddi'],
        "pais"      => $list['pais'],
        "nome"      => ((empty($list['nome'])) ? null : $list['nome']),
        "dataEnvio" => date("d/m/y H:i:s A", strtotime($list['dataEnvio'])),
        "dataDlr"   => date("d/m/y H:i:s A", strtotime($list['dataDlr'])),
        "status"    => $list['status'],
        "desc"      => $list['descricao'],
        "rota"      => $list['rota'],
        "tarifa"    => $list['tarifa'],
        "moeda"     => $list['moeda']
      ];
    }

Onde eu tenho a seguinte estrutura de tabelas

 

sms_mt

image.png.b508cb700bf7efc4d8c20374c6e0fbe6.png

 

sms_mo
image.png.73e17831f920a46404dc5c2244b5a7e2.png

 

Com a consulta que estou utilizando, eu estou tendo problemas de atraso na resposta.

Para consultas com mais de 3.000 registros, minha aplicação demora mais de 2 minutos para trazer tais resultados. o que eu acho muito tempo.

Se eu faço uma pesquisa de mais de 20k de linhas, a aplicação demora mais de 8 minutos...

 

Essa consulta eu puxo sem paginação porque a faço através do PHP + AngularJs que aplica a paginação com base no objeto json total recebido do banco de dados.

 

Como posso otimizar essa query ou a tabela para ter melhor performance?
Todas as colunas com a chavinha cinza de indice, estão agrupadas num indice indez unico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Marcones Borges
      Bom dia, esto tentando inserir dados de um formulário em duas tabelas ao mesmo tempo.
       
      Gostaria de sua ajuda!
       
      Arquivo Insere
       

      $conexao = conexao::getInstance();         // Recebe os dados enviados pela submissão         $acao  = (isset($_POST['acao'])) ? $_POST['acao'] : '';         $id    = (isset($_POST['id'])) ? $_POST['id'] : '';         $nome  = (isset($_POST['nome'])) ? $_POST['nome'] : '';         $funcao = (isset($_POST['funcao'])) ? $_POST['funcao'] : '';         $cpf   = (isset($_POST['cpf'])) ? str_replace(array('.','-'), '', $_POST['cpf']): '';         $status           = (isset($_POST['status'])) ? $_POST['status'] : '';   $sql = 'INSERT INTO historico (registro_ministro, descricao, data_registro, usuario )                VALUES(:registro_ministro, :descricao, :data_registro, :usuario )';                  $stm = $conexao->prepare($sql);             $stm->bindValue(':registro_ministro', $registro_ministro);             $stm->bindValue(':descricao', $descricao);             $stm->bindValue(':data_registro', $data_registro);             $stm->bindValue(':usuario', $usuario);             $retorno = $stm->execute();                          if ($retorno):                 echo "<div class='alert alert-success' role='alert'>Registro editado com sucesso, aguarde você está sendo redirecionado ...</div> ";             else:                 echo "<div class='alert alert-danger' role='alert'>Erro ao editar registro!</div> ";             endif;             echo "<meta http-equiv=refresh content='0;URL=ministros.php'>";         endif; $sql = 'INSERT INTO ministro (nome, cpf,  funcao, status )                VALUES(:nome, :cpf, :rg,  :funcao, :status, )';                                $stm = $conexao->prepare($sql);             $stm->bindValue(':nome', $nome);             $stm->bindValue(':cpf', $cpf);             $stm->bindValue(':status', $status);             $stm->bindValue(':funcao', $funcao);
       
      Porém só executa o ultimo código não executa o primeiro o que pode ser ?
       
    • Por avelar.avelar
      Galera, estou tentando pegar de um arquivo TXT, 4 informacoes que cada linha dele da e gravar numa tabela do banco de dados, e esta dando erro e já mexi e remexi e não sei pq nao da certo, alguem poderias me ajudar?

      processa.php
      <?php
      session_start();
      //Incluir a conexao com BD
      include_once("conexao.php");
      //Receber os dados do formulário
      //$arquivo = $_FILES['arquivo'];
      //var_dump($arquivo);
      $arquivo_tmp = $_FILES['arquivo']['tmp_name'];
      //ler todo o arquivo para um array
      $dados = file($arquivo_tmp);
      //var_dump($dados);
                          $line = fgets($dados);
                         for($x=0; $x<0; $x++) {
                              $line = fgets($dados);
                          }
                          $ArrayRetornogru = array();
                          echo "dados".$dados;
                          echo "line". $line;
                          break;
                          
                          
                          while ($line = fgets($dados)) {
                                      
                                  $data_vencto = substr($line, 56,8);
                                  $data_pago = substr($line, 101,8);
                                  $valor          = substr($line, 122,4);
                                  $cpf  = substr($line, 256,11);
                                  // captar as 3 variaveis e fazer a busca das inscricoes pelo cpf data e valor
                                  echo $data_pago;
                                  echo $data_vencto;
                                  echo $valor;
                              $nbr_cpf = $cpf;
                              $parte_um     = substr($nbr_cpf, 0, 3);
                              $parte_dois   = substr($nbr_cpf, 3, 3);
                              $parte_tres   = substr($nbr_cpf, 6, 3);
                              $parte_quatro = substr($nbr_cpf, 9, 2);
                              $monta_cpf = "$parte_um.$parte_dois.$parte_tres-$parte_quatro";
                              echo $monta_cpf;
                               $ArrayRetornogru[] = $monta_cpf;
                                   
                                      echo "<pre>";
                                          print_r($ArrayRetornogru);
                                      echo "</pre>";
                                      echo "TESTE";
                                      
                          }
                          fclose($dados);
                          print_r($ArrayRetornogru);
                          echo "teste 2";
                          break;
                          
                          
      foreach($dados as $linha){
          $linha = trim($linha);
          $valor = explode(',', $linha);
          var_dump($valor);
          
          $data_vencto = $ArrayRetornogru[0];
          $data_pago = $ArrayRetornogru[1];
          $valor = $ArrayRetornogru[2];
          $cpf = $ArrayRetornogru[3];
          
          $result_usuario = "INSERT INTO gru_concurso (data_vencto, data_pago, valor, cpf) VALUES ('$data_vencto', '$data_pago', '$valor', '$cpf')";
          
          $resultado_usuario = mysqli_query($conn, $result_usuario);    
      }
      $_SESSION['msg'] = "<p style='color: green;'>Carregado os dados com sucesso!</p>";
      header("Location: index.php");
       
      ARQUIVO TXT:
       

       
      de cada linha eu preciso tirar as informacoes datavencto, datapago, valor, cpf e gravar numa tabela a parte.
       
      Falow galera !!!
       
       
       
    • Por Regina ltc
      Bom dia pessoal!
      Tenho uma aplicação que gera boletos num webservice do banco Santander. (uso php e banco MySql)
      Eu que informo o numero do boleto ao banco.
      tenho uma tabela (cobbole) onde guardo o ultimo numero de boleto gerado gerado.
      Quando um usuário vai gerar um boleto, eu bloqueio as tabelas, pego o ultimo numero de boleto já gerado, somo 1 neste numero, insiro o registro na tabela de boletos, somo um no ultimo numero gerado e atualizo a tabela cobbole, para que o próximo usuário que vá gerar boletos já use o novo numero.
      Acontece que, neste caminho, algo não funciona, pois em alguns momentos tenho obtido mensagem do banco que estou tentando imprimir um novo boleto com um numero já utilizado.
      Acho que mais de uma pessoa está conseguindo fazer o procedimento ao mesmo tempo (ler qual o último numero de boleto usado) e ambas tentam gerar boletos com o mesmo número.
      Ou seja, a minha ideia de bloquear as tabelas não está surtindo efeito.
      Colocarei aqui a sequencia de comandos que estou usando para ver se vcs conseguem me ajudar a descobrir onde está o erro.
      Muito obrigada!
       
       
      //começo a transação
      $conexao->beginTransaction();
       
      //bloqueio as tabelas
      $sql = "lock tables cobbole write , BoletoFichaFin write";

       
      //nesta clausula localizo o último número de boleto utilizado (uso o comando for update):
      $sql = "select * from cobbole where rcgempresa='" . $empresa . "' and convcob='" . $conveniobanco . "' for update";

       
      //insiro na tabela BoletoFichaFin o novo boleto gerado somado um numero a mais
      $sql = "insert into BoletoFichaFin ....novonumerodeboleto.."
       
      //faço update da tabela cobbole atualizando o numero atual do boleto com o numero novo criado no passo anterior
      $sql = "update cobbole set num_atual = "           . $complemento . " where IDFicha = " . $idficha;
       
      //finalizo a transação
      $conexao->commit();

       
      //desbloqueio as tabelas
      $sql = "unlock tables";
       
    • Por Jcouto
      A desgraça que tenho é que somente o comando insert não estar funcionando. Achei que fosse culpa do servidor que tava rodando que era o wampserver, mas tentei ate o easyphp e continua não funcionando.
       
      <?php try { $conn = new PDO("mysql:host=localhost;dbname=teste", "root", ""); }catch(PDOException $e){ echo $e->getMessage(); } $n = "aaaa"; $insert = $conn->prepare("INSERT INTO usuarios(nome) VALUES(:nome)"); $insert->bindValue(":nome", $n); $insert->execute(); ?> fiz pra teste e creio que estar tudo certo ate upei no 000webhost.com e FUNCIONOU -_-
      Estou começando a achar que estar faltando algo na minha maquina ou seila.... quem puder ajudar agradeço!
      e nozes 
       
    • Por Paulo Roberto99
      Está dando o seguinte erro: Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\projeto\listar.php on line 6
      Já fechei '}' e o erro continua. alguém pode me ajudar?
       
      <?php
      session_start();
          require_once("servidor.php");
          if (isset($_GET['enviar'])) {
              if (!empty(isset($_GET['nome']) / !empty(isset($_GET['cpf']) / !empty(isset($_GET['rg']) / !empty(isset($_GET['rua']) / !empty(isset($_GET['numero']) / !empty(isset($_GET['cep']) / !empty(isset($_GET['bairro']) / !empty(isset($_GET['cidade']) / !empty(isset($_GET['estado']) / !empty(isset($_GET['celular']) / !empty(isset($_GET['email']) / !empty(isset($_GET['lixo'])) {
                  $nome=$_GET['nome'];
                  $cpf=$_GET['cpf'];
                  $rg=$_GET['rg'];
                  $rua=$_GET['rua'];
                  $numero=$_GET['numero'];
                  $cep=$_GET['cep'];
                  $bairro=$_GET['bairro'];
                  $cidade=$_GET['cidade'];
                  $estado=$_GET['estado'];
                  $celular=$_GET['celular'];
                  $email=$_GET['email'];
                  $lixo=$_GET['lixo'];
                  $sql="INSERT INTO moradores (nome, cpf, rg, rua, numero, cep, bairro, cidade, estado, celular, email, lixo) VALUES ('$nome', '$cpf', '$rg', '$rua', '$numero', '$cep', '$bairro', '$cidade', '$estado', '$celular', '$email', '$lixo')";
                  $enviar=mysqli_query($conn, $sql);
                  if ($enviar) {
                      $_SESSION['mensagem']="Dados Cadastrados";
                      header("location:index.php");
                      exit;
                  } else {
                      $_SESSION['mensagem']="Erro ao cadastrar os dados";
                      header("location:index.php");
                      exit;
                  }
              }   
          }
      ?>
×

Informação importante

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