Je développe une application Web à haut volume, dont une partie est une base de données MySQL de messages de discussion qui devront passer à plus de 20 millions de lignes, en douceur.
J'avais initialement prévu d'utiliser MyISAM pour les tables (pour les capacités de recherche de texte intégral intégrées ), mais l'idée que la table entière soit verrouillée en raison d'une seule opération d'écriture me fait fermer. Les verrous au niveau des lignes ont tellement plus de sens (sans parler des autres avantages de vitesse d'InnoDB lorsqu'il s'agit de tables énormes). Donc, pour cette raison, je suis assez déterminé à utiliser InnoDB.
Le problème est ... InnoDB n'a pas de capacités de recherche plein texte intégrées.
Dois-je utiliser un système de recherche tiers? Comme Lucene (c ++) / Sphinx ? L'un de vous ninjas de la base de données a-t-il des suggestions / conseils?Le zoie de LinkedIn (basé sur Lucene) semble être la meilleure option pour le moment... ayant été construit autour de capacités temps réel (ce qui est assez critique pour mon application.) J'hésite un peu à m'engager mais sans une certaine perspicacité ...
(FYI: va être sur EC2 avec des rigs à haute mémoire, en utilisant PHP pour servir le frontend)
Réponses:
Je peux garantir que le texte intégral MyISAM est une mauvaise option - même en laissant de côté les divers problèmes avec les tables MyISAM en général, j'ai vu le texte intégral dérailler et commencer à se corrompre et à planter MySQL régulièrement.
Un moteur de recherche dédié sera certainement l'option la plus flexible ici - stocker les données de publication dans MySQL / innodb, puis exporter le texte vers votre moteur de recherche. Vous pouvez configurer assez facilement une compilation / publication d'index complète périodique et ajouter des mises à jour d'index en temps réel si vous en ressentez le besoin et que vous souhaitez passer du temps.
Lucene et Sphinx sont de bonnes options, tout comme Xapian , qui est agréable et léger. Si vous suivez la voie Lucene, ne supposez pas que Clucene ira mieux, même si vous préférez ne pas lutter avec Java, même si je ne suis pas vraiment qualifié pour discuter des avantages et des inconvénients de l'un ou l'autre.
la source
Parallèlement à la suppression progressive de MyISAM, la recherche de texte intégral InnoDB (FTS) est enfin disponible dans la version MySQL 5.6.4.
Beaucoup de détails juteux sur https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .
Alors que d'autres moteurs ont beaucoup de fonctionnalités différentes, celui-ci est InnoDB, donc il est natif (ce qui signifie qu'il y a un chemin de mise à niveau), et cela en fait une option intéressante.
la source
Vous devriez passer une heure et passer par l'installation et l'essai routier de Sphinx et Lucene. Voyez si l'un ou l'autre répond à vos besoins en matière de mise à jour des données
L'une des choses qui m'a déçu à propos de Sphinx est qu'il ne prend pas très bien en charge les insertions incrémentielles. Autrement dit, il est très coûteux de réindexer après une insertion, si cher que la solution recommandée consiste à diviser vos données en lignes plus anciennes et inchangées et en lignes plus récentes et volatiles. Ainsi, chaque recherche effectuée par votre application devrait effectuer deux recherches: une fois sur l'index le plus grand pour les anciennes lignes et également sur l'index le plus petit pour les lignes récentes. Si cela ne s'intègre pas à vos modèles d'utilisation, ce Sphinx n'est pas une bonne solution (du moins pas dans son implémentation actuelle).
Je voudrais souligner une autre solution possible que vous pourriez envisager: la recherche personnalisée Google . Si vous pouvez appliquer un peu de référencement à votre application Web, sous-traitez la fonction d'indexation et de recherche à Google et intégrez un champ de texte de recherche Google dans votre site. Cela pourrait être le moyen le plus économique et le plus évolutif de rendre votre site consultable.
la source
Peut-être ne devriez-vous pas rejeter le FT de MySQL si rapidement. Craigslist l'utilisait .
Éditer
Comme commenté ci-dessous, Craigslist semble être passé à Sphinx au début de 2009.
la source
Sphinx, comme vous le faites remarquer, est assez sympa pour ce genre de choses. Tout le travail est dans le fichier de configuration. Assurez-vous que quelle que soit votre table avec les chaînes, elle possède une clé d'identifiant d'entier unique, et tout devrait bien se passer.
la source
essaye ça
la source
Vous devriez jeter un oeil à Sphinx. Cela vaut la peine d'essayer. Son indexation est super rapide et elle est distribuée. Vous devriez jeter un œil à ce webminar (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Il parle de recherche et a quelques points de repère intéressants. Vous pouvez trouver cela utile.
la source
Si tout le reste échoue, il y a toujours soundex_match , qui n'est malheureusement pas vraiment rapide et précis
la source
Pour toute personne bloquée sur une ancienne version de MySQL / MariaDB (c'est-à-dire les utilisateurs CentOS) où InnoDB ne prend pas en charge les recherches Fulltext, ma solution lors de l'utilisation des tables InnoDB était de créer une table MyISAM séparée pour ce que je voulais rechercher.
Par exemple, ma table InnoDB principale était
products
avec diverses clés et intégrité référentielle. J'ai ensuite créé une simple table MyISAM appeléeproduct_search
contenant deux champs,product_id
etproduct_name
où ce dernier était défini sur unFULLTEXT
index. Les deux champs sont en fait une copie de ce qui se trouve dans laproduct
table principale .Je recherche ensuite sur la table MyISAM en utilisant le texte intégral, et je fais une jointure interne vers la table InnoDB.
Le contenu de la table MyISAM peut être tenu à jour via des déclencheurs ou le modèle de l'application.
Je ne le recommanderais pas si vous avez plusieurs tables qui nécessitent du texte intégral, mais pour une seule table, cela semble être un travail adéquat jusqu'à ce que vous puissiez mettre à niveau.
la source