备用MySQL全文搜索语法

时间:2010-02-11 16:40:39

标签: mysql full-text-search

如果您希望相关性以及结果按相关性排序,则FULLTEXT查询的通用格式为:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance FROM users WHERE MATCH(name) AGAINST('Bob')

作为开发人员,我总是喜欢让我的代码干掉(不要重复自己)。是否有任何理由不将查询编写为:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance FROM users HAVING relevance > 0 ORDER BY relevance DESC

它似乎返回相同的结果,但是我应该担心ORDER BY会导致查询速度变慢吗?这些查询是否相同?

指定MATCH()两次不会降低性能,如MySQL手册中所述。

Natural Language Full-Text Searches

  

要达到这个效果,你应该这样做   指定MATCH()两次:一次在   SELECT列表和WHERE一次   条款。这不会导致额外的   开销,因为MySQL优化器   请注意两个MATCH()来电   相同并调用全文   只搜索一次代码。

1 个答案:

答案 0 :(得分:1)

不幸的是,根据MySQL SELECT documentation,“HAVING子句几乎在最后一次应用,就在项目发送到客户端之前,没有优化。”

不同之处在于,第一个查询将使用全文索引来计算name中具有“Bob”的行的相关性 。第二个查询将计算所有行的相关性,然后丢弃其中的大部分(可能在对整个表进行排序之后)。因此,第二个查询明显更慢。即使您将ORDER BY子句放在第一个查询上,它仍然比使用HAVING更快:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance
FROM users
WHERE MATCH(name) AGAINST('Bob')
ORDER BY relevance DESC

通常,“不要对应该在WHERE子句中的项目使用HAVING。”