如果您希望相关性以及结果按相关性排序,则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()
来电 相同并调用全文 只搜索一次代码。
答案 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。”