在MySQL中进行全文搜索的最有效方法

时间:2009-08-24 20:59:20

标签: mysql full-text-search

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

此查询花费了太多时间来执行。有没有办法改善这个?我做错了吗?

由于

4 个答案:

答案 0 :(得分:5)

我会转移到全文搜索引擎,而不是尝试优化它。

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

答案 1 :(得分:4)

MYSQL具有全文搜索支持,可提供更好的性能。

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

但是,如果您打算对应用程序施加任何重大负担,我建议使用专为全文搜索设计的系统。

答案 2 :(得分:1)

对于后期跟进感到抱歉,但是你不是在对这三张桌子进行笛卡尔式的加入吗?

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行。

我希望看到类似假设您拥有一个数据库,其中Artist属于一个乐队并播放一个乐器:

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

答案 3 :(得分:0)

您可以执行以下操作,这不是全文搜索吗?

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

或(我的偏好):

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