提问人:Colin R. Turner 提问时间:10/11/2023 最后编辑:Bill KarwinColin R. Turner 更新时间:10/11/2023 访问量:38
MySQL MATCH in column select 或 in where 子句。有区别吗?
MySQL MATCH in column select or in where clause. Is there a difference?
问:
这两个MySQL语句有什么区别(如果有的话)?如果我在子句中使用,是否有性能差异,还是没有必要?MATCH
WHERE
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;
答:
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%'
评论