2009-08-24 15 views
4

私は3つのテーブルを持っており、検索タームボックスのクエリを作成したいと思います。クエリは現在次のようになります。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'); 

このクエリは実行に時間がかかりすぎています。これを改善する方法はありますか?私は何か間違っているのですか?

おかげ

答えて

5

私の代わりにこれを最適化しようとしているの全文検索エンジンに移動します。

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

+1

+1それはスフィンクスまたは何か他のものであること:

私はアーティストが一つのバンドに所属し、1つの楽器を果たしてデータベースを持っていると仮定のようなものを見ることを期待しますか?商用ツールもあります.BTW) –

4

MYSQLは、はるかに優れたパフォーマンスが得られますフルテキスト検索をサポートしています。

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

しかし、私はあなたのアプリケーション上の任意の大きな負荷を配置する予定がある場合全文検索のために設計されたシステムを使用することをお勧めします。

+0

お返事ありがとうございます。私は複数の正解を選ぶことができたらいいと思います。 –

0

フルテキスト検索ではない次のようなことができますか?

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

か(私の好み):後半のフォローアップのための

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

申し訳ありませんが、あなたはデカルトを行っていないが、これらの3つのテーブルに対して参加しますか?

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'); 

100個のバンド、10個の楽器、500人のアーティストが500,000行を検索していると仮定します。 (Luceneのを、外部のエンジンを使用するための

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')); 
関連する問題