2011-04-19 37 views
2

我正在做一个MySQL全文搜索。如何优化mysql全文联合搜索?

我的数据库表article1~18000文章,article2~7000文章,article3~13000文章。字段猫是一个INDEX字段

现在我想进行联合搜索。有5组词汇放入3张表中,找出结果。但处理时间为3.1213495136 seconds。 (我加了microtime()看看会花费多少时间)。有什么办法来优化MySQL全文联合搜索?谢谢。

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE))) 
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE))) 
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE))) 
Order By date DESC LIMIT 10 
+0

我建议你切换到外部全文搜索服务器,如sphinxsearch.com。从我的经验来看,狮身人面像比mysql全文搜索快了x倍。 – 2011-04-22 08:01:46

回答

3

你应该做的第一件事就是添加

Order By date DESC LIMIT 10 

到每个子查询,你并不需要超过10个结果中结束。

所有表中的字段“日期”也必须有索引。

alter table "TABLENAME" add index date_idx(date); 

此外:

您可能会缩短,并通过改变搜索条件,表格查询略有加快的那样: “()|()”

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10) 
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10) 
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10) 
Order By date DESC LIMIT 10 
+0

@Andriy Bohdan,请原谅,是否需要将“日期”字段更改为“INDEX”。每篇文章的日期都不一样。它可以更快地帮助查询吗?谢谢。 – cj333 2011-04-22 08:26:40

+0

@ cj333是的,它确实可以提供帮助。 – Emmerman 2011-04-22 08:32:23

+0

有可能在日期的索引不起作用。最好的方法是使用索引测试查询,而不使用它。要查看索引是否有帮助,可以运行EXPLAIN 并检查mysql是否在日期使用索引。 – 2011-04-22 08:40:18

1

到您的工会另一种方法是,以作为单独的搜索进行这些。如果您按照相关性排列您的标准,那么第一组是最好的;返回部分结果,并且只有在少于10个的情况下,才能尝试下一个匹配等。

然后,查询对于最终用户来说很快,返回结果的相关顺序,并且不会浪费MySQL资源获取不需要的数据。如果用户要求更多,则可以运行更长时间的低效率查询,但这是有意义的。