Ir para conteúdo

POWERED BY:

Arquivado

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

cassiano óliver

Busca em InnoDB

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

TRUNCATE TABLE `tabela_myisam`;
INSERT INTO `tabela_myisam` SELECT * FROM `tabela_innodb` WHERE 1;

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha Cassiano, esse assunto de innoDB me deixou intrigado, pesquisei em alguns sites americanos (principalmente no stackoverflow) e encontrei esse:

http://stackoverflow.com/questions/2545827/replacement-relevance-sorting-for-mysql-fulltext-in-innodb-tables

 

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.

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.