Mysql

如何快速使用 ORDER BY 進行 FULLTEXT 搜尋?

  • July 17, 2021

我試圖讓一個簡單的 FULLTEXT 匹配在超過 1 億行的表的另一列上使用 order by 時更快。基礎是一個在兩列上有全文的表,我想搜尋數據庫,但按主要(最少/最近)或流行度對其進行排序。是否可以在另一個索引列上快速創建 FULLTEXT?下面的 SQL Fiddle 帶有架構並解釋了所有查詢:

請參閱SQL 小提琴 #1

到目前為止非常快的是在單獨的表和連接中對搜尋列進行非規範化,但如果沒有必要,我寧願沒有另一個表。下面的 SQL Fiddle(最後的非規範化查詢):

請參閱SQL 小提琴 #2

這裡的第一個問題是你無法控制的。它是什麼 ???

查詢優化器對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;

應該變成類似的東西

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;

範例 #2

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

應該變成類似的東西

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;

結論

主要思想:收集使用的密鑰MATCH ...AGAINST並將其連接回源表

引用自:https://dba.stackexchange.com/questions/145490