MySQL MATCH in column select 或 in where 子句。有区别吗?

MySQL MATCH in column select or in where clause. Is there a difference?

提问人:Colin R. Turner 提问时间:10/11/2023 最后编辑:Bill KarwinColin R. Turner 更新时间:10/11/2023 访问量:38

问:

这两个MySQL语句有什么区别(如果有的话)?如果我在子句中使用,是否有性能差异,还是没有必要?MATCHWHERE

SELECT `column`, MATCH(`column`) AGAINST ("searchterm") AS `rank` 
FROM `table` 
ORDER BY `rank` DESC;

SELECT `column`, MATCH(`column`) AGAINST ("searchterm") AS `rank` 
FROM `table` 
WHERE MATCH(`column`) AGAINST ('searchterm') 
ORDER BY `rank` DESC;
mysql 匹配 全文搜索

评论


答:

1赞 Bill Karwin 10/11/2023 #1

第一个示例运行表扫描。这必须检查表中的每一行,甚至是那些与 AGAINST() 谓词中的模式不匹配的行。

第二个示例仅检查匹配的行(我假设您已经定义了全文索引)。

性能主要与检查的行成正比,因此第二个示例应该要好得多。

当然,也存在一些极端情况,例如,如果“搜索词”几乎出现在每一行上。但我假设一个典型的情况,即您的搜索匹配一小部分行。

0赞 Akshit Gupta 10/11/2023 #2

从性能的角度来看,可能会有细微的差异,但通常很小,两者之间的选择取决于您的特定用例:

  • 如果要检索具有相关性分数的搜索结果,则第一条语句更合适。
  • 如果只想要与搜索词匹配的行,而不需要检索相关性分数,则第二条语句更合适。

这两个语句将返回相同的搜索结果,但第二个语句在筛选出不匹配的行时可能效率更高。

评论

0赞 Colin R. Turner 10/11/2023
这两个示例都将返回匹配分数作为排名。
1赞 Rick James 10/12/2023
省略遗嘱仍按“等级”排序。ORDER BY
1赞 Rick James 10/11/2023 #3

子句中的任何内容都用于过滤 -- 显示匹配的行;跳过其他的。WHERE

子句中的任何内容都会为匹配的每一行显示。SELECT

WHERE MATCH...-- 在这种情况下,MATCH 本质上是一个布尔值 -- 用于过滤。

SELECT MATCH ...提供相关性数字,粗略地说明匹配项的“好”程度。

SELECT ... WHERE MATCH ...-- 只显示匹配的行。(这可能是最有用的。注意:默认情况下,这些行按相关性排序。

SELECT MATCH ... WHERE MATCH ...-- 筛选并显示数字,对于不匹配的行,该数字将为 0。

FULLTEXT在大多数情况下,比WHERE column LIKE '%searchterm%'