FULLTEXT搜索 - 索引未在OR搜索中触发,但它在AND搜索上

时间:2014-06-26 10:58:03

标签: mysql sql indexing full-text-search

好的,抱歉这个奇怪的标题,但我认为它涵盖了它。

我正在努力提高我的简历搜索数据库的性能。 30,000条记录并且不断增长,我们看到了一些性能问题。

我创建了一个字段索引,它减慢了速度,这是CV的文本正文(所有重复的单词和停用词已被删除)。

我创建了该字段的全文索引,它对单词查询(如“DRILLER”)或两个单词查询(如“DRILLER AND PAINTER”)的工作效果很好。我可以在EXPLAIN上看到索引正在触发,而事情正在快速 - 快乐的日子。

我的问题。当我执行搜索“DRILLER OR CLEANER”时,索引不会触发,查询时间会延迟到6秒左右。我的SQL查询;

FAST - 使用索引

SELECT nl_id FROM CV 
 WHERE (  ( MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
       AND  MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE) ) )

SLOW - 索引未触发

SELECT nl_id FROM CV
 WHERE (    ( MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
         OR   MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE) ) )
 LIMIT 15 OFFSET 0

我在这里摸不着头脑,感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

OR可能会导致查询优化出现问题。您可以通过将查询编写为:

来解决此问题
(SELECT nl_id
 FROM CV
 WHERE MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
) UNION
(SELECT nl_id
 FROM CV
 WHERE MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE)
)
LIMIT 15 OFFSET 0;

使用LIMIT子句,您应该使用ORDER BY。否则结果是不确定的,因为查询的结果无法保证顺序。

另外,请注意UNION的使用。这将删除两个单词出现的重复项。

答案 1 :(得分:0)

你有几个选择来解决这个OR问题。请记住,OR会投射更广泛的网络 - 匹配更多的东西 - 而不是AND。并缩小搜索范围,或者扩大搜索范围。

通过在单个搜索中搜索两个术语,可以更好地利用MATCH子句中的BOOLEAN MODE。

MATCH (nl_striptext) AGAINST ('driller cleaner' IN BOOLEAN MODE)

这可能是你最好的选择。这很快。

您还可以使用两个搜索的SQL UNION来实现OR操作。戈登在另一个答案中提供了这种方法。