Mysql
如何快速使用 ORDER BY 進行 FULLTEXT 搜尋?
我試圖讓一個簡單的 FULLTEXT 匹配在超過 1 億行的表的另一列上使用 order by 時更快。基礎是一個在兩列上有全文的表,我想搜尋數據庫,但按主要(最少/最近)或流行度對其進行排序。是否可以在另一個索引列上快速創建 FULLTEXT?下面的 SQL Fiddle 帶有架構並解釋了所有查詢:
請參閱SQL 小提琴 #1
到目前為止非常快的是在單獨的表和連接中對搜尋列進行非規範化,但如果沒有必要,我寧願沒有另一個表。下面的 SQL Fiddle(最後的非規範化查詢):
請參閱SQL 小提琴 #2
這裡的第一個問題是你無法控制的。它是什麼 ???
查詢優化器對
FULLTEXT
索引的反應。為什麼 ?(現在想像一下帶有滾動文字的星球大戰電影的開頭……)
很久以前,我發現
FULLTEXT
索引會使 MySQL 查詢優化器對其他索引的使用無效
Jun 10, 2011
:Mysql全文布爾忽略片語Oct 25, 2011
:在 BOOLEAN MODE 中忽略 FULLTEXT 索引,條件為“字數”Mar 18, 2012
:為什麼在 MySQL 的 FULLTEXT 索引上 LIKE 比 MATCH…AGAINST 快 4 倍以上?- 更喜歡它!
建議
重構查詢,以便
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
並將其連接回源表