webfuture 0 Denunciar post Postado Maio 25, 2007 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
walace 1 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
walace 1 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
walace 1 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
jothaz 1 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
Prog 183 Denunciar post Postado Maio 25, 2007 Qual é o comando real? Esses campos 1, 2, 3... são de que tipo? Compartilhar este post Link para o post Compartilhar em outros sites
webfuture 0 Denunciar post Postado Maio 25, 2007 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
Prog 183 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
Prog 183 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 Uso PhpMyAdmim, por ele tem alguma opção que faça isto ?xavier Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Maio 25, 2007 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
webfuture 0 Denunciar post Postado Maio 25, 2007 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
Prog 183 Denunciar post Postado Maio 28, 2007 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
webfuture 0 Denunciar post Postado Maio 28, 2007 Olá Prog, valeu pelas dicas, vou efetuar os testes, qualquer coisa posto aqui...Obrigado a todos,Xavier Compartilhar este post Link para o post Compartilhar em outros sites