2009-08-24 6 views
4

J'ai 3 tables, et je veux faire une requête pour un champ de recherche. Ma requête ressemble actuellement à ceci:Meilleur moyen efficace de faire une recherche fulltext dans MySQL

SELECT Artist.* FROM Artist, Band, Instrument WHERE MATCH (Artist.name) AGAINST ('mysearchterm') OR MATCH (Band.name) AGAINST ('mysearchterm') OR MATCH (Instrument.name, Instrument.description) AGAINST ('mysearchterm'); 

Cette requête prend trop de temps pour être exécutée. Y a-t-il un moyen d'améliorer cela? Est-ce que je fais quelque chose de mal?

Merci

Répondre

5

Je proposerais à un moteur de recherche en texte intégral au lieu d'essayer d'optimiser ce.

a le soutien de la recherche en texte intégral

http://www.sphinxsearch.com/about.html

+1

+1 pour l'utilisation d'un moteur externe, que ce soit Sphinx ou quoi que ce soit d'autre (Lucene? il ya des outils commerciaux aussi, btw) –

4

MYSQL qui donnera de meilleures performances.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-restrictions.html

Cependant, je recommande d'utiliser un système conçu pour rechercher du texte si vous avez l'intention de placer une charge importante sur votre application.

+0

Merci pour votre réponse, je voudrais pouvoir choisir plus d'une réponse correcte. –

0

Pouvez-vous faire quelque chose comme ce qui suit, qui n'est pas une recherche de texte intégral?

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.name LIKE '%mysearchterm%'... 

Or (ma préférence):

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.name REGEXP '<regexp here>'... 
1

Désolé pour le suivi en retard, mais ne vous faites une jointure cartésienne contre ces trois tableaux? En supposant une base de données de 100 bandes, 10 instruments et 500 artistes, vous recherchez 500 000 lignes.

j'attendre à voir quelque chose comme en supposant que vous avez une base de données où l'artiste appartient à un groupe et joue un instrument:

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.band_id = Band.id and Artist.instrument_id = Instrument.id and (MATCH (Artist.name) AGAINST ('mysearchterm') OR MATCH (Band.name) AGAINST ('mysearchterm') OR MATCH (Instrument.name, Instrument.description) AGAINST ('mysearchterm')); 
Questions connexes