Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal.
Postei esse tópico em MySQL mas ta tendo muita leitura e nenhuma resposta e é algo que tenho uma certa urgência, então como aqui deve haver algumas pessoas que já passaram pelo que estou passando pode ser que resolva.
Estou com uma dúvida em relação a melhor forma de se fazer uma consulta para um sistema de busca em MySQL.
Queria fazer algo que funcionasse como o Like buscando palavras entre os termos (%palavra%), mas que não seja o Like pois ele é muito lento para consultas muito volumosas e este sistema tende a ser muito volumoso
Andei pesquisando e vi esta técnica de utilizar uma tabela de termos e buscando com id's e indices.
http://www.devmedia.com.br/post-11807-Full-text-search-otimizada-em-SQL-usando-GROUP-BY.html
Estou desenvolvendo um sistema de assessoria política em que a idéia é encontrar facilmente os eleitores na base de dados.
Preciso buscar resultados com campos de: Nome do Eleitor, Cidade, Bairro, Descrição do Usuário, E-mail entre outros.
Isso para mim até é válido em um campo descritivo (TEXT), porque posso simular tags no texto para encontrar usuários que tenham a mesma descrição que estou buscando (ex.: moreno, alto, futebol) porém tem todos estes outros campos que gostaria de fazer esse tipo de consulta mas acredito não ser a melhor opção criar diversas tabelas de termos até porque a tendência é que o banco ficasse enorme com muito mais facilidade.
Alguém conhece alguma forma de fazer uma busca otimizada sem dar voltas com outras tabelas?
Vi algo sobre utilizar o MATCH mas não sei se é realmente vantajoso.
Minha tabela é Innodb, não me interessa utilizar MyiSAM para utilizar o FULL TEXT SEARCH
Justamente pelo lock no Innodb que é por registro e do MyiSAM que é por tabela.
Quem poder dar uma luz agradeço
Ta cara isso eu sei, o problema é exibição e sim a busca.
Buscar 1 termo entre milhões é pesado, ainda mais quando tem trocentas colunas buscando o mesmo termo.
Quero algo que otimize a busca por termos, pois é uma tabela que tende a ficar muito grande.
Por isso você tem que usar um 'LIMIT' .. veja também http://forum.imasters.com.br/topic/408267-tempo-gasto-pelas-consultas/
Cara como falei LIMIT é exibição.
Se busco a palavra moreno no banco de dados em uma tabela com 6 milhões de linhas.
Primeiramente ele vai buscar a palavra moreno em cada uma das 6.000.000 de linhas do sistema por exemplo.
Só depois de varrer todas as linhas que ele terá o resultado por "relevância" - 1.500.000 linhas
Tendo esse milhão e meio de linhas já em mãos é que o MySQL vai em fim utilizar o LIMIT para ver quantos resultados você quer exibir.
Ou seja, ele ainda vai consultar seis milhões de linhas de qualquer jeito.
E vai retornar um milhão e meio de linhas de qualquer jeito.
A diferença é a quantidade que ele vai exibir.
Obs: 6.000.000 de linhas buscando em 1 coluna, se a busca fosse em 7 colunas em cada linha 6x6x6x6x6x6 = 279.936.000.000 de tentativas de encontrar o resultado.
-------------
Nessa lógica que você diz, se eu colocando LIMIT 20, e o MySQL limitasse em 20 resultados antes de buscar como você acredita que seja, ele faria a busca em cima dos 20 resultados o que não seria de grande utilidade.
Por isso estou preocupado com a busca, é um banco que tende a crescer muito, principalmente a tabela de contatos.
E como o número de colunas já é alto, quanto mais colunas forem buscadas, mais carregada a consulta.
Pelo menos é o que eu acho, o limit faz sentido pra mim dessa forma 'limitar a busca em somente 15 linhas', e outra .. se o volume de dados é tão grande assim, nem te recomendo utilizar banco relacional, procura um orientado a documentos como MongoDB ..
Cara, se você tem muitos registros, isso deve ser limitado e paginado, ninguém exibe do nada 2000 registros por exemplo, apesar de que 2000 registros não é 10% do que o MySQL é capaz.