Estou desenvolvendo meu próprio CMS e usando MySql v5.5 DB para salvar os registros de itens de conteúdo.
Devido a limitações técnicas, não posso atualizar meu banco de dados para uma versão mais recente que suporte pesquisas de texto completo em tabelas InnoDB.
Seria uma boa prática usar tabelas MyISAM para pesquisas textuais enquanto os dados "reais" são salvos no mecanismo de armazenamento InnoDB ?
Exemplo:
- O usuário cria o item de conteúdo e o salva no banco de dados
- Todos os campos de itens de conteúdo são salvos em uma tabela InnoDB .
- Todos os campos de texto são empilhados juntos e salvos em um único campo dentro de uma tabela MyISAM que também inclui um campo de ID adicional com referência ao item de conteúdo original.
Quando o usuário realiza uma pesquisa baseada em texto, vou consultar a tabela MyISAM usando uma consulta de pesquisa de texto completo que me dará referências a todos os registros correspondentes em minha tabela InnoDB .
Conclusão - isso é considerado uma boa solução em termos de desempenho e para melhorar os recursos de pesquisa do meu CMS, ou devo continuar com o bom e velho operador LIKE e consultar usando apenas a tabela InnoDB?
Funciona. Tem um desempenho razoavelmente bom.
Você tem duas tabelas, uma é InnoDB e contém a maioria dos atributos de uma entidade. A outra é MyISAM, é 1:1 com a primeira tabela, e contém um
TEXT
campo, maisFULLTEXT
índice.A consulta relevante se parece com:
Acho que
MATCH
sempre ocorrerá primeiro, mesmo que os testesi
possam ser mais seletivos. Essa é a natureza deFULLTEXT
.jkavalik mencionou alguns problemas de consistência; mas isso pode ser evitado escolhendo cuidadosamente a ordem em que você
INSERT
nas duas tabelas e se você usaREPLACE
ouIODKU
em vez de uma planícieINSERT
para um dos `INSERTs.(Acredito ter feito o que você descreve em um ou dois projetos. Desde então, medi que o InnoDB
FULLTEXT
parece ser mais rápido.)Resumindo: vá em frente e faça.
Adendo Como ordenar as instruções para minimizar problemas de integridade de dados.
Casos...
INSERTs
bem-sucedidos ou ambos falharem.INSERT
, você deve detectá-lo e,ROLLBACK
em vez deCOMMIT
. Daí uma boa integridade.COMMIT
falhar, haverá uma linha extra na tabela MyISAM, para a qual não há linha InnoDB. Dois casos...Se uma
FULLTEXT
pesquisa atingir essa linha, aJOIN
tabela InnoDB falhará, obtendo assim a resposta 'certa' (a um custo menor).Se você vier mais tarde e reutilizá-lo
id
para reinserir a linha (ou inserir uma linha diferente), o IODKU "fará a coisa certa". Tudo está bem.Observação (destinada a outros leitores): Essa técnica de misturar uma tabela InnoDB com uma tabela não transacional
INSERT
funciona em outros casos. Considere colocar uma imagem (.jpg) em um arquivo, enquanto coloca os 'metadados' da imagem em uma linha do InnoDB. Na pior das hipóteses, você pode ter uma imagem extra ou duplicada armazenada no sistema de arquivos.Vamos começar comparando entre MyISAM e InnoDB:
Visão geral
MyISAM :
InnoDB :
O InnoDB é mais resistente à corrupção de tabelas do que o MyISAM.
Suporte para grande buffer pool para dados e índices.
Bloqueio em nível de linha.
Desvantagens ou limitações
MyISAMGenericName
InnoDB :
Quando devo usar o MySIAM? Se a aplicação é simples e precisa ser rápida. No entanto, não deve ser usado quando a integridade dos dados for uma prioridade.
Quando devo usar o InnoDB? O InnoDB é a melhor opção se você precisar criar um aplicativo da Web baseado em dados confiável.
Compare entre os índices MyISAM e InnoDB FULLTEXT e consultas LIKE para pesquisa de texto completo, você pode ler o exemplo a seguir .
P: Seria uma boa prática usar tabelas MyISAM para pesquisas textuais enquanto os dados "reais" são salvos no mecanismo de armazenamento InnoDB?
R: sim, geralmente é feito por meio de texto completo para o InnoDB
Solução alternativa de pesquisa de texto completo do InnoDB:
Você pode fazer algum tipo de sincronização de dados usando gatilhos (se sua versão do mysql os suportar). Eles permitem que você execute pequenos trechos de SQL em determinados pontos, como depois que os dados são inseridos ou excluídos de uma tabela.
Sempre que dados são inseridos na tabela INNODB, os mesmos dados são inseridos automaticamente na tabela MYISAM.
Referências:
Link adicional caso você queira ler a atualização para o MySQL 5.6: https://www.percona.com/blog/2013/07/31/innodb-full-text-search-in-mysql-5-6-part- 3/