2009-09-09 6 views
0

Considérez ce scénario, ma table de base de données a 300000 lignes et a un index fulltext. Chaque fois qu'une recherche est effectuée, elle verrouille la base de données et n'autorise personne d'autre à se connecter au portail.Mysql FULLTEXT index, recherche verrouille la table

Tout conseil sur la façon de faire les choses ici sera vraiment appréciable.

+0

Etes-vous sûr que cet index est utilisé? Essayez d'utiliser expliquer sur la requête. – Pomyk

Répondre

2

La connexion active-t-elle une écriture dans la table? par exemple. une "dernière visite"?

Si tel est le cas, vous pouvez vous attendre à un comportement de ce type car MyISAM écrit un verrou sur toute la table. Habituellement, cela est évité en n'utilisant pas MyISAM noddy et en passant à InnoDB, qui a un verrouillage au niveau de la ligne (parmi d'autres fonctionnalités de base de données souhaitables).

Le problème, bien sûr, est que vous obtenez seulement la recherche de texte intégral avec MyISAM.

Vous devrez donc diviser vos tables. Si vous pouvez conserver les éléments en texte intégral et en texte intégral dans une table différente de celle qui a besoin d'être écrite (mais liée à l'aide de la même clé primaire), vous pouvez probablement faire en sorte que les deux opérations ne s'affectent pas.

Mieux, faites migrer la plus grande partie de la table vers InnoDB, en laissant uniquement un champ de texte intégral dans MyISAM. Tout sauf les recherches fulltext peuvent alors éviter la table MyISAM, et utiliser uniquement la table InnoDB qui présente des performances de verrouillage beaucoup mieux. Personnellement, j'ai maintenant tendance à tout stocker dans la table InnoDB, y compris le texte, et à stocker une deuxième copie du texte dans la table MyISAM uniquement à des fins de recherche de texte intégral; cela simplifie les requêtes et le code et apporte les avantages de la cohérence d'InnoDB au contenu textuel, et je l'utilise également pour traiter le searchbait afin d'obtenir des fonctions de traduction et d'autres fonctionnalités que le fulltext de MySQL ne supporte normalement pas. Mais cela signifie que vous devez dépenser beaucoup plus d'espace sur le stockage.

Vous pouvez également améliorer les choses en réduisant le nombre d'écritures. Par exemple, si est l'horodatage de la 'dernière visite' que vous écrivez, vous pouvez éviter d'écrire cela, sauf si, disons, une minute s'est écoulée entre le moment précédent et le moment présent, étant donné que personne ne doit connaître deuxième personne a accédé au site pour la dernière fois.

+0

Ou vous pouvez utiliser la réplication et avoir l'utilisateur maître InnoDB et utiliser MyISAM sur l'esclave. Vous pouvez ensuite effectuer des recherches de texte intégral sur l'esclave. – ejunker

+0

Cela semble être une bonne idée! Avez-vous fait cela en pratique, des pièges à surveiller avec une éventuelle inadéquation des capacités du moteur? – bobince

0

Si vous utilisez un moteur de recherche externe ou des plug-ins de recherche MySQL Lucene ou Sphinx, ils devraient pouvoir lire et indexer sans verrouiller la table. Ils stockent une version locale des enregistrements indexés, ils n'ont donc pas besoin de lire la table très souvent et n'ont jamais besoin d'écrire dessus.

Questions connexes