Ir para conteúdo
ndias

[Resolvido] MySql COUNT com WHERE, o count é lento

Recommended Posts

select t1.id, (select count(campo) from tabela2 where id = t1.id)
from tabela1 t1
where .......

select t1.id, (select count(t2.campo) from tabela2 t2 inner join tabela1 on tabela1.id = t2.id where t2.id = t1.id)
from tabela1 t1
where .......

select t1.id, count(t2.campo)
from tabela1 t1
left join tabela t2 on t2.id = t1.id
where .......

Estou tentando dessas 3 formas e a única que roda é a segunda...mesmo assim, com muita lentidão...

 

Existe alguma outra melhor forma de montar essa query?

Compartilhar este post


Link para o post
Compartilhar em outros sites
35 minutos atrás, Motta disse:

Estas tabelas tem índices ?

 

As estatisticas estão atualizadas ?

 

 

@Motañ possuem índices e as estatísticas estão atualizadas SIM...inclusive essa mesma query eu rodava de boa no MS-SQL. Só que resolvi migrar de banco de dados e to enfrentando essa dificuldade com MySql

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 minutos atrás, Motta disse:

O problema pode ser a falta de índices , fez o plano de execução da sql

@Mota ñ fiz o plano de execução!

ñ estou usando SQL. Eu usava SQL e não tinha problema com lentidão. Daí eu migrei para MySql e parece que a consulta fica lenta por causa do where pois percorre a tabela toda (que não é pequena) para contar os registros.

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 M. Alberto
      O que preciso alterar para acessar meu banco de dados remotamente?
       
      Tenho o IP e outros dados... como faço com este código?
       
      <?php $link = mysql_connect('localhost', 'USUARIO_NOME', 'SENHA_ACESSO'); if (!$link) { die('Não conseguiu conectar: ' . mysql_error()); } $db_selected = mysql_select_db('BANCODEDADOS_NOME', $link); if (!$db_selected) { die ('Não pode selecionar o banco : ' . mysql_error()); } $rst_pedidos=mysql_query("SELECT * FROM pedidosgarotao WHERE impresso='nao' ORDER BY id",$link); $num_pedidos=mysql_num_rows($rst_pedidos); if ($num_pedidos==0) { ?>  
    • Por M. Alberto
      Estou realizando a migração de meu site que utiliza um banco de dados em mySQL PHP porém estou obtendo erro.
       
      Criei o banco de dados e fiz upload dos arquivos, porém agora neste servidor não roda de maneira alguma. Alguém poderia me ajudar ?
    • Por netocazuza
      Tenho uma rotina em php que está funcionando, gravando os dados numa tabela. Agora surgiu a necessidade de fazer dois testes antes da gravação, e eu não estou conseguindo ter idéia de como fazer, por isso vou postar no próprio código pra ver se entendem. O primeiro teste, é ver se o número escolhido, já foi selecionado (variável numero), e caso isso ocorra, não gravar. O outro teste é impedir que o mesmo usuário (usuário apostador)faça mais de uma aposta. Segue código:
      <?php require_once 'init.php'; // pega os dados do formuário $data_hora = isset($_POST['data_hora']) ? $_POST['data_hora'] : null; $apostador = isset($_POST['apostador']) ? $_POST['apostador'] : null; // quero que esse apostador não se repita. Se já estiver na tabela, avisar e sair. $telefone = isset($_POST['telefone']) ? $_POST['telefone'] : null; $numero = isset($_POST['numero']) ? $_POST['numero'] : null; // quero que cheque esse número na tabela existente, e caso exista, retornar para inserir outro.     // validação (bem simples, só pra evitar dados vazios) if (empty($data_hora) || empty($apostador) || empty($telefone) || empty($numero)) {     echo "Volte e preencha todos os campos";     exit; } $hoje = date("d-m-Y H:i"); $limite = ('08-03-2019 16:35');    if (strtotime($hoje) >= strtotime($limite)){         echo "Esgotado o horario limite. Aguarde para o próximo sorteio!";         exit;     } // a data vem no formato dd/mm/YYYY // então precisamos converter para YYYY-mm-dd // insere no banco $PDO = db_connect(); // Acredito que esse teste deva ser feito aqui, antes de gravar, mas é só um palpite, pois tô mais perdido do que padre (alguns) em boate //verificar se apostador e numero já existem na tabela, e caso exista, retornar o fluxo $sql = "INSERT INTO palpites(data_hora, apostador, telefone, numero) VALUES(:data_hora, :apostador, :telefone, :numero)"; $stmt = $PDO->prepare($sql); $stmt->bindParam(':data_hora', $data_hora); $stmt->bindParam(':apostador', $apostador); $stmt->bindParam(':telefone', $telefone); $stmt->bindParam(':numero', $numero);     if ($stmt->execute()) {     header('Location: index.php'); } else {     echo "Erro ao cadastrar";     print_r($stmt->errorInfo()); }
    • Por lucasrodrigues
      Estou com esse problema ao tentar vincular uma tabela do MySql a um DataSet. Utilizo o MySqlConnector 8.0.13, MySql-For-VisualStudio 1.2.8.

    • Por Charlie04
      Tenho uma tabela de mídias que contem ID e nome das mídias e outra com locais onde existe o ID da midia que esta no local (1 local pode der + de 1 midia ).
      Gostaria de ajuda pra conseguir selecionar quantas mídias iguais estão em cada locais.

      MIDIAS
      ID                   |    Nome 
                   
      1                    |    Coca-cola
      2                    |    Painel Disponível
      3                    |    Fanta
       
       
      IDLOCAL           IDMIDIA                               
      1                    |    1
      1                    |    1
      1                    |    2
      1                    |    3
      2                    |    1 
      1                    |    2
      2                    |    3
      2                    |    1
      1                    |    2
      2                    |    2
       
      A resposta que eu queria é parecida com isso , mas não estou conseguindo montar o select :(
      Contar quantas vezes determinado IDMIDIA aparece no mesmo IDLOCAL;
       
      IDLOCAL                    IDMIDIA                          Quantidade         
      1                             |    Coca-cola                             | 2
      1                             |    Painel Disponível                | 3
      1                             |    Fanta                                     | 1
      2                             |    Fanta                                     | 1
      2                             |    Painel Disponível                | 1
      2                             |    Coca-cola                             | 2
       
       

      Se alguém puder me ajudar eu agradeço, sou iniciante então por isso a duvida provavelmente seja básica , desde já Obrigado.
×

Informação importante

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