MySQL全文搜索ORDER BY列

时间:2014-12-06 12:17:08

标签: mysql full-text-search

以前可能会问过这个问题,但我不能为我的生活找到答案。

为了避免

SELECT * FROM student WHERE name LIKE '%searchphrase%' ORDER BY score

根据我的理解,它永远不会使用索引,并且总是会使用filesort,并且能够使用 FULLTEXT 索引。

问题:如果我执行全文搜索,如何在没有文件排序的情况下按分数订购?

1 个答案:

答案 0 :(得分:0)

结果行将按照它们在FULLTEXT索引中的顺序出现,这当然不是ORDER BY score所需的顺序,因此需要为ORDER BY中的filesort排序全文匹配。单独的步骤,这就是score所做的。

唯一的替代执行计划是以(score, name)顺序检索行,然后逐行应用全文匹配,这完全违反了任何全文特定的优化。

在您的情况下可能有意义的是,如果您的搜索表达式涵盖学生行的大部分内容,则LIKE上的综合索引会坚持score,在这种情况下,您可以以LIKE顺序获取索引扫描,并且可以在索引条目上评估score表达式。你正在获得完整的索引扫描而不是全表扫描,并且不需要额外的排序,因为索引条目已经由{{1}}排序。

但是,如果匹配行的数量相对于表中的行总数而言相当小,首先执行全文索引查找,然后是filesort,这将是更好的计划。