如何使用 ORDER BY 快速进行全文搜索?

JJJ*_*JJJ 5 mysql mariadb full-text-search mysql-5.6

当在超过 1 亿行的表上的另一列上使用 order by 时,我试图获得简单的全文匹配,以便更快地进行。基础是一张包含两列全文的表,我想搜索数据库,但按主要(最少/最近)或流行度对其进行排序。是否可以通过另一个索引列上的 order by 快速创建全文?下面的 SQL Fiddle 包含架构并解释了所有查询:

请参阅SQL Fiddle #1

到目前为止,非常快的是在单独的表和连接中对搜索列进行非规范化,但如果没有必要,我宁愿不使用另一个表。下面的 SQL Fiddle(最后是非规范化查询):

请参阅SQL Fiddle #2

Rol*_*DBA 4

第一个问题是你无法控制的。它是什么 ???

查询优化器对FULLTEXT索引的反应。为什么 ?

(现在想象一下星球大战电影的开头有滚动文字......)

很久以前,我发现FULLTEXT索引会使MySQL查询优化器对其他索引的使用无效

建议

重构查询,以便MATCH ...AGAINST仅收集键

例子#1

SELECT a.id FROM a 
WHERE
MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)
ORDER BY a.id DESC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

应该变成类似的东西

SELECT N.id FROM
(SELECT id FROM a WHERE
MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)) M
INNER JOIN a N USING (id)
ORDER BY N.id DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

例子#2

SELECT a.id,a.popularity FROM a 
WHERE
MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)
ORDER BY a.popularity DESC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

应该变成类似的东西

SELECT N.id,N.popularity FROM
(SELECT id FROM a WHERE
MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)) M
INNER JOIN a N USING (id)
ORDER BY N.popularity DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

结论

主要思想:使用收集键MATCH ...AGAINST并将其连接回源表