MySQL de Recherche de texte Intégral solution de Contournement pour les tables innoDB
Je suis de la conception d'une application web interne qui utilise MySQL comme base de données principale. L'intégrité des données est cruciale, donc je suis en utilisant le innoDB
moteur de sa contrainte de clé étrangère fonctionnalités.
Je veux faire une recherche de texte intégral d'un type de documents, et qui n'est pas pris en charge nativement avec les tables innoDB. Je ne suis pas prête à passer à l' MyISAM
tables en raison de leur manque de support des clés étrangères et en raison du fait que leur verrouillage par table, pas par ligne.
Serait-il une mauvaise pratique de créer un miroir de table des disques que j'ai besoin de recherche en utilisant le moteur MyISAM et l'utiliser pour la recherche en texte intégral? De cette façon, je suis à la recherche d'une copie des données et si quelque chose arrive à ces données, il n'est pas aussi grand d'une affaire, car il peut toujours être re-créé.
Ou est-ce une façon maladroite de faire ce qui doit être évité?
Grâce.
OriginalL'auteur Rob | 2010-04-14
Vous devez vous connecter pour publier un commentaire.
Vous pourriez être en mesure de faire une sorte de synchronisation de données à l'aide de déclencheurs (si votre version de mysql supporte). Ils vous permettent d'exécuter de petits extraits de SQL à certains points, tels que une fois les données insérées ou supprimées à partir d'une table.
Par exemple...
... À chaque fois que les données sont insérées dans la table INNODB, les mêmes données sont automatiquement insérées dans la table MYISAM.
oui déclencheurs sont pris en charge en 5.1
JDBC n'ont pas de lien avec les déclencheurs qui sont à la base de données de côté pour autant que je sais. Michael votre solution est très sale comme premier coup d'œil mais tout à fait efficace (n'est-ce pas réinsérez l'ensemble des données après chaque insertion ?)
non, le
last_insert_id()
assure l'attrape qu'une seule ligne.OriginalL'auteur michael
Je pense que c'est vraiment maladroit. Cela dit, mon "rapide de prototype qui sera probablement accidentellement devenir de la production de code" méthode de le faire, c'est quelque chose comme ceci:
Et pour les points de bonus que vous pourriez faire tout cela à l'intérieur d'une transaction qui conviennent à votre envie (double bonus si vous êtes en utilisant non les connexions persistantes et de rechercher uniquement une fois par connecter, que vous pouvez ensuite éliminer l'instruction drop).
Oui je me rends compte que ce n'est pas vrai miroir/de réplication. Oui je me rends compte de gruger la table peut être cher (relativement petits jeux de données ici). Comme je l'ai dit, rapide et sale prototype. YMMV
Seule chose qui est mieux que le code a été la mise en garde. 😛
Comment recréer la totalité de l'index sur chaque requête sera mieux qu'une recherche avec
LIKE
?OriginalL'auteur pcarter
Vous pouvez créer un miroir de table. C'est probablement moins que l'idéal, la table MyISAM ne pas respecter vos transactions (en cas d'échec de la transaction sur InnoDB, les modifications apportées à MyISAM dans cette transaction apparaîtra).
Vous pouvez utiliser un dédié de recherche de texte intégral d'un système comme le Sphinx, qui est ce que j'ai utilisé pour la recherche plein texte (Depuis ma base de données InnoDB).
OriginalL'auteur Mitch Dempsey
Je pense que le plus simple solution de ce problème est la création d'une table d'index qui seront utilisés pour les recherches, avec un pointeur retour à la table qui contient les données réelles. Je me pose exactement le même problème et je ne veux pas utiliser les tables MyISAM pour mon système en raison de la paix de l'esprit donné par les tables InnoDB.
Donc, ce que je prévois de faire avec mon problème est de créer une table d'index à l'aide de MyISAM, afin que je puisse avoir seulement les informations à indexer. La synchronisation sera effectuée à l'aide de déclencheurs, qui est la plus simple façon de le faire. Je ne veux pas reproduire l'intégralité de la table, car il vous en coûtera beaucoup d'espace. Cependant, le fait de reproduire uniquement les champs souhaités coût de l'espace au détriment de la moteur de recherche de la facilité.
Cette table d'index peut être comprise comme un indice pour la recherche des installations. Comme tout indice, il vous en coûtera de l'espace. Comme une optimisation, les données insérées sur cette table d'index peuvent être que des termes, mais de cette façon, un traitement supplémentaire est nécessaire afin de nettoyer parole inutile pour la recherche.
OriginalL'auteur Ronaldo Faria Lima
De bonnes nouvelles! Dans MySQL 5.6 et des index de texte intégral peut être utilisé avec les tables InnoDB. Vous devriez envisager la mise à jour de votre serveur MySQL 5.6 ou si vous ne l'avez pas encore.
Avec ma demande de recherche de texte intégral a été très important, donc j'ai simplement utilisé MyISAM. Maintenant, j'ai mis à jour MySQL 5.6, converti la base de données InnoDB et ajouté le bon contraintes. Le meilleur de la peine mondes.
MySQL 5.6 Manuel De Recherche De Texte Intégral Les Fonctions
OriginalL'auteur Syclone