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 _marlon307
      Tenho uma tabela em meu banco de dados em que as colunas usuário e e-mail são do tipo unio. Como faço para verificar as duas colunas ao mesmo tempo e retorna um valor se encontrar um registro iguai.
    • Por leonardo021970
      Tem alguma maneira de capturar todas as urls do site?
      Testei pelo google mas ele retorna apenas alguns resultados pelo jeito que testei
    • Por _marlon307
      Estou fazendo um sistema simples de cadastro de usuário e preciso que o usuário e e-mail sejam únicos. Mas já configurei a minha tabela para que esses campos seja único. O problema e fazer a checagem para que não retorne erros, e sim redirecionar para pagina de cadastro.
       
      Código:
      <?php require_once 'config/connect.php'; $usermail = mysqli_real_escape_string($link, $_POST['email']); $username = mysqli_real_escape_string($link, $_POST['usuario']); $userpsw = mysqli_real_escape_string($link, $_POST['senha']); $sql = "SELECT usuario, email FROM `tb_usuarios` WHERE `usuario` = '$username', `email` = '$usermail'"; mysqli_query($link, $sql) or die(mysqli_error($link)); $linhas = mysqli_affected_rows($link); if($linhas > 0) { header("Location:cadastro"); } else { $sql = "INSERT INTO tb_usuarios (usuario, senha, email) VALUES ('$username','$userpsw','$usermail')"; mysqli_query($link,$sql) or die(mysqli_error($link)); $linhas = mysqli_affected_rows($link); if($linhas > 0) { header("Location:login"); } } ?>  
    • Por eduardom
      Olá.
       
      Tentarei exemplificar o problema.
       
      Tenho uma tabela com duas colunas e seus respectivos conteúdos:
      VALOR (int), DATA (datetime)
      1, 2018-12-10 20:50:00
      5, 2018-12-13 12:00:00
      4, 2018-12-13 13:00:00
      3, 2018-12-13 17:00:00
      2, 2018-12-15 06:00:00
      9, 2018-12-15 08:00:00
       
      Consulto as informações, por exemplo:
       
      SELECT * FROM TABELA WHERE DATA BETWEEN '2018-12-13 00:00:00' AND '2018-12-13 23:59:59'
       
      Está me trazendo somente os valores 4 e 5, o 3 ele não trás, porém todos estão dentro do período.
      Com isso, estou perdendo registros nas consultas.
      Buscando somente o valor 3 direto, (SELECT * FROM TABELA WHERE VALOR = 3), ele trás a informação normalmente.
      Adicionei e removi os índices, tentei otimizar a tabela, porém nada resolve.
      Não sei se envolve o tamanho da tabela, pois há 2.782.219 registros na mesma.
       
      Estrutura da tabela: InnoDB
      Formatação da tabela: utf8_general_ci
       
      Se alguém tiver uma luz...
    • Por nosredna
      Olá amigos, vocês poderiam me ajudar?
       
      Eu tenho a input abaixo em PHP, quando eu acabar de digitar algo eu desejo que ela selecione o texto digitado automaticamente. É possível? Como eu faria?
      Exemplo abaixo:

       
      Agradeço a ajuda. Valeuuuu.
×

Informação importante

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