我有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');
此查询花费了太多时间来执行。有没有办法改善这个?我做错了吗?
由于
答案 0 :(得分:5)
我会转移到全文搜索引擎,而不是尝试优化它。
答案 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>'...