代码之家  ›  专栏  ›  技术社区  ›  ejunker

可选mysql全文搜索语法

  •  0
  • ejunker  · 技术社区  · 15 年前

    如果希望关联性和结果按关联性排序,则全文查询的通用格式为:

    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

    它似乎返回了相同的结果,但我是否应该通过使查询变慢来担心订单?这些查询是否等效?

    指定 MATCH() 两次不会降低MySQL手册中提到的性能。

    Natural Language Full-Text Searches

    为了达到这个结果,你应该 指定 匹配() 两次:一次在 SELECT 一旦进入 WHERE 条款。这不会导致额外的 开销,因为mysql优化器 注意到这两个 匹配() 电话是 完全相同并调用全文 只搜索一次代码。

    1 回复  |  直到 15 年前
        1
  •  1
  •   eswald    15 年前

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

    不同的是,第一个查询将使用全文索引计算相关性 只有 对于有“bob”的行 name . 第二个查询将计算 全部的 行,然后抛出大部分行(可能在对整个表进行排序之后)。因此,第二个查询速度明显较慢。即使将ORDER BY子句放到第一个查询中,它仍然比使用HAVING更快:

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

    一般来说,“对于应该在WHERE子句中的项目,不要使用HAVING。”