Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

webfuture

Select com ORDER BY Lento

Recommended Posts

Galera, estou com um problemão aqui, tenho um script de busca que faz a pesquisa pela informação digitada em 3 campos do banco de dados (atualmente o banco tem em média 600.000 registros), se eu deixo sem order by data desc ou qualquer outra coisa vai super rapido, a busca funciona em menos de 1 segundo, agora se eu coloco ai pronto, começa a vir em 3, 5, 7 ou mais... alguém sabe me dizer como resolver isto ou o que pode ser? Uso banco de dados MySQL, é uma tabela somente, pensei em talvez dividir esta tabela em 2 tabelas, sei la, deixar na tabela principal somente os campos que sao usados na busca e os outros em outra.. sinceramente nao sei como resolver..O select retornado é:CODESelect campo1, campo2, campo3, campo4, campo5 from Tabela where campo1 like '%forum%' or campo2 like '%forum%' or campo3 like '%forum%' LIMIT 0 , 10Quem puder ajudar,Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em pesquisas web não costumo usar like '%%', assim se o cara nao digitar nada no parametro a pesquisa sera na tabela inteira e por um campo que talvez nao seja indice.

 

Outra solução é você criar índices para os campos de pesquisa.

Mas vê aí se não tem como você restringir ou filtrar de forma diferente a pesquisa.

 

No artigo abaixo tem algumas dicas, para oracle, mais algumas servem também para o mysql e outros bancos.

http://www.devmedia.com.br/articles/viewcomp.asp?comp=2424

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá walace, valeu pelas dicas, você tem alguma outra sugestão para ser usada ao inves do Like ? Uso o like por ele permitir fazer a busca em qualquer parte do campo atras do que o cara digitar, e se o cara nao digitar nada eu barro....Vou ver como faço para criar indices nos campos,Valeu,Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

Potz cara, sei lá, tentar usar like 'campo%', daí você restringe a pesquisar só no início, mas aí nao ajuda muito.Neste teu caso o que eu pensaria é em pelo menos tirar estes OR's que você tem aí. Mesmo com o like eu não sei se os índices irão te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Walace, este lance de mandar buscar somente no inicio até cheguei a fazer o teste mas nao ajuda mesmo pelo fato de so buscar no inicio dos campos, o que me resta é fazer o teste com os index, você ve alguma outra solução para o sistema fincionar rapidamente?Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao tenta os índices ou tirar um ou outro OR.Mas perai ? A lentidão só aparece quando você usa o order by ? Sem order by fica tudo normal ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, a lentidão só acontece quando coloco o order by, se eu tiro a pesquisa vem em 1 segundo no maximo.Pior que não da para tirar ainda os Or's...Mais para frente vou usar um campo somente mas agora não da ...Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,você ja pensou em utilizar UNION ao invez de OR?Talvez possa melhorar a performance.t-+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jothaz, não nunca cheguei a usar o union, lembro que o banco de daados tem uma tabela somente.Vou dar uma pesquisada a este respeito, ele faz o mesmo que o like? Não seria para quando se tem duas tabelas?Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

O comando real é:

 

Select title, url, description, keywords, date_entered from TB_Sites where title like '%forum%' or description like '%forum%' or keywords like '%forum%' ORDER BY SiteIdNo DESC LIMIT 0 , 10

É um exemplo, os campos title, url, description, keywords são varchar(255)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O campo SiteIdNo é sua chave primária? Este campo esta indexado?

Você menciona, no primeiro post, que sua intenção seria ordenar pela data, tente criar um indice no seu campo do tipo data e veja se a velocidade fica dentro do esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O campo siteidno é chave primaria sim, não esta indexado.como faço para criar o indice ? ainda não mexi com isto, estou dando uma procurada a respeito.Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

você usa alguma interface de administração? Como phpMyAdmin? (método mais simples)

Ou faz direto por linha de comando? (médoto mais complexo)

 

Dê uma lida aqui:

http://dev.mysql.com/doc/refman/4.1/pt/mysql-indexes.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo phpMyAdmin, quando você esta na tela de estrutura de uma tabela, você pode criar, editar e/ou eliminar seus indíceis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Prog, vi que entrando nas propriedades da tabela (estrutura) ele tem uma opção indice, seria somente eu mandar fazer isto e ele ja criaria um indice? Simples assim ? Caso sim, como ficaria o select para trabalhar com o index? Muda muita coisa?Outra duvida, vamos supor, eu inserindo dados na tabela sempre que buscar vai trazer os dados atualizados?Xavier

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Prog, vi que entrando nas propriedades da tabela (estrutura) ele tem uma opção indice, seria somente eu mandar fazer isto e ele ja criaria um indice? Simples assim ?

Simples assim... só precisa "configurar" seu indice de acordo com seus selects, por exemplo, se você coloca 2 campos no order by, crie um indice com esses 2 campos.

 

Caso sim, como ficaria o select para trabalhar com o index? Muda muita coisa?

Não muda em nada, o MySQL utiliza o melhor indice para sua consulta.

 

Outra duvida, vamos supor, eu inserindo dados na tabela sempre que buscar vai trazer os dados atualizados?

Sempre atualizados! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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