Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá amigos,
Sempre utilizei tabelas MyISAM em minhas bases, principalmente pelo recurso FULLTEXT para pesquisas.
Estou querendo agora utilizar InnoDB, porém, o recurso acima não é permitido. Neste tipo de tabela a forma de busca é com LIKE mesmo? Há outras formas?
Desde já agradeço à atenção.
Olá SilverFox,
Primeiramente, obrigado mais uma vez por sua atenção.
Acho que não entendeu, na verdade, questionei sobre uma forma de pesquisar resultados em uma tabela.
Em MyISAM, eu posso utilizar FULLTEXT em campos indexados desta forma.
Ex: Procurando um termo qualquer em alguma tabela...
... WHERE MATCH(campo) AGAINST('+terMo>' IN BOOLEAN MODE)
Como o recurso acima não funciona em InnoDB, quero saber qual o método ideal para realizar uma pesquisa neste tipo de tabela, é usando LIKE?
Assim?
... WHERE LIKE '%campo%'
Entendeu?
Entendi sim, só queria lhe passar uma solução alternativa para não perder um recurso tão útil como o FULLTEXT. Infelizmente não sei qual seria melhor para innoDB.
Espero que consiga sua resposta =/ sinto não poder ajuda-lo mais.
Certo, explique-me melhor então, pois EU é que não entendi.
Não tem que desculpar-se, eu é que agradeço por sua ajuda.
Para innoDB só vi mesmo LIKE '%%', infelizmente nunca trabalhei com innoDB por isso não conheço seus recursos (se existe algo próximo ao fulltext)
A ideia que lhe passei anteriormente era criar uma tabela temporária (em MyIsam)
Ficaria assim:
TABELA INNODB - sua tabela original
TABELA MYISAM - tabela clone
A tabela clone mantem os dados atualizados conforme a tabela original, sempre que houver uma atualização a tabela clone recebe os dados atualizados, durante a pesquisa FULLTEXT não é necessário.
Ae quando for fazer uma pesquisa (fulltext), ela busca os dados da tabela CLONE e compara as IDS encontradas com a tabela innoDB.
Não sei como seria o melhor fazer a comparação, se é com o a linguagem SERVER-SIDE ou com MYSQL mesmo.
Pois não pude testar para ter noção de como reage o desempenho.
Se for usar uma sub-select, talvez tenha que usar **IN**:
SELECT * FROM `innodb_original` WHERE `id` IN (SELECT `id` FROM `myisam_cloando` WHERE [sua condição de pesquisa])
Quando for atualizar informações(update):
TRUNCATE TABLE myisam_cloando;#limpando
INSERT INTO myisam_cloando SELECT * FROM innodb_original WHERE 1;#clonando
Assim manterá os dados atualizados para pesquisas. Não sei se essa é a melhor maneira. Mas é uma ideia.
Espero que lhe ajude.
Agora sim entendi. Obrigado pela sugestão.
Eu já pesquisei bastante não encontrei nenhuma alternativa à FULLTEXT para InnoDB.
Vou aguardar para ver se alguém tem mais possibilidades.
Olha Cassiano, esse assunto de innoDB me deixou intrigado, pesquisei em alguns sites americanos (principalmente no stackoverflow) e encontrei esse:
Melhorei um pouco o código, eu usei LCASE pois a função REPLACE é sensitiva
Aonde escrevi "termo" é aonde ficará a palavra chave que você quer pesquisar.
A vantagem que vi nesta maneira é que não necessita fazer alterações na tabela que nem é no MyIsam para funcionar FULLTEXT.
O problema é que não sei se é tão exata quanto o FULLTEXT, não há como buscar multi-termos sem usar uma linguagem como PHP ou sem criar uma função dentro do MySql.
E também não sei se o desempenho desse código pode ser inferior
Ficou assim:
SELECT *,(LENGTH(coluna) - LENGTH(REPLACE(LCASE(coluna), LCASE('termo'), '')))
AS relevancia
FROM tabela_innodb
WHERE coluna LIKE '%termo%'
ORDER BY relevancia DESC
Espero que ajude.
Obrigado Silver, irei testá-lo.
http://www.devmedia.com.br/post-22800-Implementando-FullText-Search-no-MySQL-5-6-com-InnoDB.html
mas parece q é só a partir desta nova versão, 5.6.
Se cria-se uma tabela temporária, não sei se é o melhor jeito.
Equivalente a outra resposta que lhe passei no outro tópico:
Como disse nesse caso não sei se é o melhor jeito =/
Tambem pode-se criar um TRIGGER, mas acho que também necessitária de uma tabela temporária.