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

Busca SQL de tabelas esta muito lenta e trava


marcosfj1

Pergunta

Bom gente seguinte tive que fazer uma busca bem complexa q envolvia mtas tabelas e muitas tabelas com muitos registros. Em ambiente de teste esta funcionando afinal o ambiente de teste o banco de dados é bem mais leve que o ambiente real.

quando vou executar no ambiente real a busca trava, acho q o servidor corta e entra em looping. então queria ajuda de vocês para tentar achar um solução que deixa a busca mais rapida. Por exemplo já ouvi falar de um recurso MySQL o LIMIT que você limita o numero de requisicoes deixando a busca mais rapida e evitando q ela trave, porem no meu caso a minha busca eu jogo ela em um array para mostrar ao usuario os dados encontrados e trabalhar com eles, portanto a opção de LIMIT não seria viavel pois não mostraria todos os dados

alguém pode me dar alguma ideia de como melhorar a velocidade da minha busca e evitar que ela trave?

Segue o codigo dela:

if ($_POST["id_cliente_uf"]) {
      
$sql = "SELECT CU.uf, CU.id_cliente_uf, CU.nome AS nome_uf, CC.nome AS nome_cidade, CC.id_cliente_uf, CC.id_cliente_cidade, SUM(PE.vl_total) AS vl_total,
          PE.id_cliente_endereco, PE.id_pedido_status, CE.cidade, SUM(PE.id_pedido_status) AS qtde_pedido
                      FROM nome_tabela CU
                      INNER JOIN nome_tabela CC ON CC.id_cliente_uf = CU.id_cliente_uf
                      INNER JOIN nome_tabela CE ON CE.id_cliente_cidade = CC.id_cliente_cidade
                      
                      INNER JOIN nome_tabela PE ON PE.id_cliente_endereco = CE.id_cliente_endereco
                      INNER JOIN nome_tabela C ON PE.id_cliente = C.id_cliente
                      WHERE CU.id_cliente_uf = {$_POST["id_cliente_uf"]} 
                      AND PE.id_pedido_status = 'x'
                      GROUP BY CC.id_cliente_cidade ";
Bom nesse codigo eu mostro as cidades que já fizeram pedido na loja apos o usuario por $_POST ter esolhido o estado. Depois faço o ARRAY para mostrar os dados que eu quero
$req = mysql_query($sql) or die(mysql_error());
          while ($cp = mysql_fetch_array($req)) {
Bom agora caso o usuario não selecione o estado a tela de entrada é uma relacao que mostrar todos os estados com a quantidade de pedidos por cada um....Traduzindo na primeira busca mostra todos os pedidos que foram feitos em todas as cidades daquele estado escolhido, CIDADE e PEDIDO Já a proxima busca que vou colocar é a tela de entrada onde mostrar todos os estados com todos os pedidos ESTADO e PEDIDO....o codigo é:
else if(!$_POST["id_cliente_uf"]) { 
            
$sql2 = "SELECT CU.uf, CU.id_cliente_uf, CC.id_cliente_uf, CC.id_cliente_cidade, SUM(PE.vl_total) AS vl_total,PE.id_cliente_endereco, PE.id_pedido_status, SUM(PE.id_pedido_status) AS qtde_pedido
                      FROM nome_tabela  CU
                      INNER JOIN nome_tabela CC ON CC.id_cliente_uf = CU.id_cliente_uf
                      INNER JOIN nome_tabela  CE ON CE.id_cliente_cidade = CC.id_cliente_cidade
                      INNER JOIN nome_tabela PE ON PE.id_cliente_endereco = CE.id_cliente_endereco
                      INNER JOIN nome_tabela  C ON PE.id_cliente = C.id_cliente
                      WHERE PE.id_pedido_status = 3
                      GROUP BY CU.uf ";
E em baixo eu faço um ARRAY para mostrar os dados
$req2 = mysql_query($sql2) or die(mysql_error());
while ($cp2 = mysql_fetch_array($req2)) {

Lembrando esta funcionando o q eu quero, mas no ambiente real esta busca por ser muito complexa trava então gostaria de saber se existe algum recurso q posso deixar ela mais rapida, sei la algum tipo de REFRESH a cada tantas consultas

alguém sabe me orientar?

Valeu

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Já que ngm sabe responder a minha primeira duvida, então vou colocar aqui mesmo um relacionada a ela

WHERE PE.id_pedido_status = x
    AND CU.id_cliente_uf = 1
    GROUP BY CU.uf
Se eu tenho isso eu busco o id_cliente_uf que for 1, beleza esta funcionado perfeitamente....Mas e se eu quiser buscar mais de um por exemplo
WHERE PE.id_pedido_status = x
    AND CU.id_cliente_uf = 1, 3, 5, 7, 21
    GROUP BY CU.uf

alguém sabe com isso seria possivel?

Valeu

Link para o comentário
Compartilhar em outros sites

  • 0

Assim...

WHERE PE.id_pedido_status = x
    AND (CU.id_cliente_uf = 1 OR CU.id_cliente_uf = 3 OR CU.id_cliente_uf = 5 OR CU.id_cliente_uf = 7 OR CU.id_cliente_uf = 21)
    GROUP BY CU.uf

Ou você pode utilizar a cláusula ANY ou IN: http://dev.mysql.com/doc/refman/5.0/en/any...subqueries.html

obs: acho que você postou sua dúvida na sessão errada... creio que se fosse na parte de Banco de dados você teria um melhor suporte...

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0
Assim...

WHERE PE.id_pedido_status = x
    AND (CU.id_cliente_uf = 1 OR CU.id_cliente_uf = 3 OR CU.id_cliente_uf = 5 OR CU.id_cliente_uf = 7 OR CU.id_cliente_uf = 21)
    GROUP BY CU.uf

Ou você pode utilizar a cláusula ANY ou IN: http://dev.mysql.com/doc/refman/5.0/en/any...subqueries.html

obs: acho que você postou sua dúvida na sessão errada... creio que se fosse na parte de Banco de dados você teria um melhor suporte...

Valeu a ajuda.... então não sei se postei na seção errada pois nem um moderador falou nada...acho q o pessoal não tem uma resposta mesmo heh...de qualquer forma obriado pela ajuda

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia, Marcusfj1!

Desculpe-me por não er procurado te ajudar.

Mas você estava com resposta, nem olhei seu post.

Uma sugestão, retire os InnerJOIN, pois se você não tem domínio de como proceder, vai travar.

Use sempre que possível o WHERE

Exemplo:

a.id_cidade = b.id_cidade AND.....e continue.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia, Marcusfj1!

Desculpe-me por não er procurado te ajudar.

Mas você estava com resposta, nem olhei seu post.

Uma sugestão, retire os InnerJOIN, pois se você não tem domínio de como proceder, vai travar.

Use sempre que possível o WHERE

Exemplo:

a.id_cidade = b.id_cidade AND.....e continue.

Abraços.

não entendi direito não...como posso retirar o INNER JOIN sendo que preciso juntar dados das tabelas....e esta funcionando os INNER JOINs....como poderia fazer sem eles?

Valeu

Link para o comentário
Compartilhar em outros sites

  • 0

Olá.

Esse Nome_tabela CU faz parte do nome?

Porque o nome da tabela não pode ter espaços;

Você está repetindo muito Nome_tabela quando separa você dá um apelido a tabela, sendo assim, qual apelido é válido?

Foi isso que eu te disse, se você não domina muito bem o mysql (ou qualquer outro sql), evite complicar muito a consulta.

Na cláusula WHERE, não é diferente do modo JOIN

Você vai pegar o campo principal da tabela vinda, com o campo da tabela que tem que tem a comparação.

Exemplo:

tbl_funcionario = IDfunc, Nome, Cpf

tbl_registro = IDregistro, Registro, IDfunc

Se eu quiser fazer uma consulta e quero que na consulta apareça o nome do funcionário, enho que fazer algo assim:

$reg = "SELECT r.registro, f.nome FROM tbl_registro r, tbl_funcionario f WHERE f.IDfunc=r.IDfunc";

Dessa forma estou falando que quero o nome do funcionário que tenha IDfunc igual ao que está na Tabela Registro.

Qualquer dúvida, retorne.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Verifique se o problema é só esse.

Porque você não me pareceu muito contente com o resultado.

Se for apenas isso, é para estar muito rápido.

O mysql é BD veloz.

Abraços.

Valeu a atenção cara, mas realmente resolveu aqui sim, a consulta ficou muito mais rapida....não sei no futuro quando as tabelas crescerem mais se vai afetar alguma coisa, mas resolveu demais o meu problema isso dos indices

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,2k
    • Posts
      652k
×
×
  • Criar Novo...