mysql - 如何加快 MYSQL FullText 的搜索或更改查询

标签 mysql full-text-search

我在 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.namem.text计算匹配,然后建立适当的relevance1relevance2 变量并在 WHEREORDER BY 中使用它们。

关于mysql - 如何加快 MYSQL FullText 的搜索或更改查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069689/

相关文章:

php从两个数组创建html表,mysql查询产生额外的单元格

mysql - 关系型数据库设计多用户类型

mysql - SQL 除以 SELECT 语句中的零错误

elasticsearch - 如何在 Elasticsearch 查询的过滤器上下文中以轻松的脚本获取文本正文字段?

MySQL 全文与点赞

php - 修复骇人听闻的 SQL where 子句

PHP 和 mysql 的 select 出现奇怪的错误

html - URL 中的 `#:~:text=` 如何突出显示文本?

postgresql - Postgres 的全文搜索什么时候支持词组匹配和邻近匹配?

php - 如何使用 PHP 从短语中搜索随机单词?