以前可能会问过这个问题,但我不能为我的生活找到答案。
为了避免
SELECT * FROM student WHERE name LIKE '%searchphrase%' ORDER BY score
根据我的理解,它永远不会使用索引,并且总是会使用filesort,并且能够使用 FULLTEXT 索引。
问题:如果我执行全文搜索,如何在没有文件排序的情况下按分数订购?
答案 0 :(得分:0)
结果行将按照它们在FULLTEXT索引中的顺序出现,这当然不是ORDER BY score
所需的顺序,因此需要为ORDER BY
中的filesort
排序全文匹配。单独的步骤,这就是score
所做的。
唯一的替代执行计划是以(score, name)
顺序检索行,然后逐行应用全文匹配,这完全违反了任何全文特定的优化。
在您的情况下可能有意义的是,如果您的搜索表达式涵盖学生行的大部分内容,则LIKE
上的综合索引会坚持score
,在这种情况下,您可以以LIKE
顺序获取索引扫描,并且可以在索引条目上评估score
表达式。你正在获得完整的索引扫描而不是全表扫描,并且不需要额外的排序,因为索引条目已经由{{1}}排序。
但是,如果匹配行的数量相对于表中的行总数而言相当小,首先执行全文索引查找,然后是filesort,这将是更好的计划。