我在 MySQL 中使用全文我需要在两个不同的表中选择两个字段 以及第一个表中名称字段的搜索优先级。这就是为什么我通过排序将结果乘以 2。这是一个很好的古怪节目。但是时间太多会有问题,在某些情况下大约需要 30 秒。我应该进行哪些更改以提高此查询的速度?
注意:
ft_stopword_file = ""
ft_min_word_len=1
The record count of each table is 200,000
查询:
$search="hello* my* name* in* prim* this* in* a* test*"
SELECT f.id, f.name FROM
Find f left join Movie m on f.`tID`=m.`id`
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE)
ORDER BY MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) +
(MATCH(f.`name`) AGAINST('$search' IN BOOLEAN MODE) *2) DESC , length(f.Address)
LIMIT 30
最佳答案
尝试移动 2 MATCH
-es 我们的 ORDER BY
以及 WHERE
到主 SELECT
稍后要重新使用的字段列表:
$search="hello* my* name* in* prim* this* in* a* test*"
SELECT
f.id, f.name,
MATCH(f.`name`,m.`text`) AGAINST('$search') as relevance1,
(MATCH(f.`name`) AGAINST('$search') *2) as relevance2
FROM
Find f left join Movie m on f.`tID`=m.`id`
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE)
ORDER BY relevance1 + relevance2 DESC , length(f.Address)
LIMIT 30
上面的代码 chuck 只是想法,我无法验证它运行时没有错误,因为我没有你的架构+数据。所以只是玩它,看看你是否能让它工作。然后比较原始代码和这个代码的执行计划。我认为应该提高性能。
此外,您不应该使用 IN BOOLEAN MODE
来获取 ORDER BY
中使用的相关性
如果你想获得真正的相关数据。如果匹配,IN BOOLEAN MODE
将始终返回 1.0 的相关性。但是在 WHERE
中,我会在 IN BOOLEAN MODE
中使用匹配。
HTH
附言。另一个想法是分别通过f.name
和m.text
计算匹配,然后建立适当的relevance1
和relevance2
变量并在 WHERE
和 ORDER BY
中使用它们。
关于mysql - 如何加快 MYSQL FullText 的搜索或更改查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069689/