好的,抱歉这个奇怪的标题,但我认为它涵盖了它。
我正在努力提高我的简历搜索数据库的性能。 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
我在这里摸不着头脑,感谢你的帮助。
答案 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操作。戈登在另一个答案中提供了这种方法。