Jump to content


Photo

Velocidade Da Consulta Mysql Em Duas Tabelas


  • Faça o login para participar
2 replies to this topic

#1 Luiz Otávio

Luiz Otávio

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado
  • Localidade:Boa Esperança - MG

Posted 05/10/2011, 16:28

Olá amigos, tenho duas tabelas no banco de dados, uma com o cadastro do cliente e outra para gerar um valor mensal de pagamentos. No último mês precisei fazer uma consulta unindo os dados das duas tabelas, preciso saber o valor e o mês que o cliente deve e também preciso pegar o nome, cpf, endereço e tudo mais na tabela de cadastro.

Eu fiz de um modo que não sei se está certo, funcionou mais ficou muito lenta a consulta, veja abaixo:

SELECT 
tabela_clientes.nome, 
tabela_clientes.cpf_cnpj, 
tabela_clientes.endereco, 
tabela_clientes.telefone, 
tabela_clientes.codigo_cliente, 
tabela_geracao.valor_mensalidade 
FROM tabela_clientes, tabela_geracao 
WHERE tabela_clientes.codigo_cliente = tabela_geracao.codigo_cliente 
AND tabela_geracao.codigo_cliente LIKE '%".$data."%' 
AND tabela_geracao.bloqueado = 0 
GROUP BY tabela_clientes.codigo_cliente 
ORDER BY tabela_clientes.nome ASC

tabela_geracao.bloqueado = 0 quer dizer que não desejo que o resultado traga os valores dos clientes bloqueados.

Já mudei e gastei todo o conhecimento que tinha e não consegui resolver a lentidão, se puderem me ajudar eu agradeço!

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 05/10/2011, 17:11

Usar um INNER JOIN deve melhorar a situação. E também não tem necessidade de GROUP BY aí.

SELECT tabela_clientes.nome,
tabela_clientes.cpf_cnpj,
tabela_clientes.endereco,
tabela_clientes.telefone,
tabela_clientes.codigo_cliente,
tabela_geracao.valor_mensalidade
FROM tabela_clientes
INNER JOIN tabela_geracao
ON tabela_clientes.codigo_cliente = tabela_geracao.codigo_cliente
WHERE tabela_geracao.codigo_cliente LIKE '%$data%'
AND tabela_geracao.bloqueado = 0
ORDER BY tabela_clientes.nome ASC

Quando se relaciona as tabelas da maneira que você fez, primeiro o MySQL vai fazer todas as combinações possíveis entre os registros e depois filtrar. Supondo que tabela_clientes tenha X registros e tabela_geracao tenha Y registros, primeiro ele monta X*Y registros e depois filtra pelo código. Usando o JOIN, na hora de relacionar os registros ele já filtra. Aí melhora o desempenho.

#3 Luiz Otávio

Luiz Otávio

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado
  • Localidade:Boa Esperança - MG

Posted 06/10/2011, 22:32

Entendi, vou testar aqui e volto para dizer o resultado.

Grato amigo!

Usar um INNER JOIN deve melhorar a situação. E também não tem necessidade de GROUP BY aí.

SELECT tabela_clientes.nome,
tabela_clientes.cpf_cnpj,
tabela_clientes.endereco,
tabela_clientes.telefone,
tabela_clientes.codigo_cliente,
tabela_geracao.valor_mensalidade
FROM tabela_clientes
INNER JOIN tabela_geracao
ON tabela_clientes.codigo_cliente = tabela_geracao.codigo_cliente
WHERE tabela_geracao.codigo_cliente LIKE '%$data%'
AND tabela_geracao.bloqueado = 0
ORDER BY tabela_clientes.nome ASC

Quando se relaciona as tabelas da maneira que você fez, primeiro o MySQL vai fazer todas as combinações possíveis entre os registros e depois filtrar. Supondo que tabela_clientes tenha X registros e tabela_geracao tenha Y registros, primeiro ele monta X*Y registros e depois filtra pelo código. Usando o JOIN, na hora de relacionar os registros ele já filtra. Aí melhora o desempenho.


Era isso mesmo, muito obrigado!




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq