我在MySQL中使用全文我需要在两个不同的表中选择两个字段 还有第一个表中名称字段的搜索优先级。这就是为什么我通过排序将结果乘以2。这是一个很好的古怪表演。但是有太多时间的问题,在某些情况下大约30秒。我应该做些什么更改来提高此查询的速度?
注意:
ft_stopword_file =“”
的ft_min_word_len = 1
每张表的记录数为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
答案 0 :(得分:0)
尝试将MATCH
- 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
字段列表中,以便稍后重复使用:
IN BOOLEAN MODE
上面的代码chuck 只是想法,我无法验证它运行没有错误,因为我没有你的架构+数据。所以,只需玩它,看看你是否可以使它工作。然后比较原始代码和此代码中的执行计划。我认为应该有性能提升。
另外,您不应该将ORDER BY
用于IN BOOLEAN MODE
中使用的相关性
如果你想获得真实的相关数据。如果匹配,WHERE
将始终返回1.0的相关性。但是在IN BOOLEAN MODE
我会在f.name
中使用匹配。
HTH
PS。另一个想法是分别按m.text
和relevance1
计算匹配,然后构建正确的relevance2
和WHERE
变量,并在ORDER BY
和rcycler_productlist.smoothScrollToPosition(0);
中使用它们}。