2017-09-06 46 views
1

我在MySQL中使用全文我需要在兩個不同的表中選擇兩個字段 還有第一個表中名稱字段的搜索優先級。這就是爲什麼我通過排序將結果乘以2。這是一個很好的古怪的節目。但是,有太多時間存在問題,並且在某些情況下大約需要30秒。我應該做些什麼來提高查詢的速度?如何加快MYSQL全文搜索或更改查詢

注:

ft_stopword_file = 「」

的ft_min_word_len = 1

每個表的記錄數爲20萬

查詢:

$search="hello* my* name* in* prim* this* in* a* test*" 

SELECT f.id, f.name FROM 
Find f left join Movie m on f.`tID`=m.`id` 
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) 
ORDER BY MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) + 
(MATCH(f.`name`) AGAINST('$search' IN BOOLEAN MODE) *2) DESC , length(f.Address) 
LIMIT 30 

回答

0

嘗試移動2 MATCH -es的ORDER BY我們還有出WHERE到主SELECT字段列表稍後重新使用:

$search="hello* my* name* in* prim* this* in* a* test*" 

SELECT 
    f.id, f.name, 
    MATCH(f.`name`,m.`text`) AGAINST('$search') as relevance1, 
    (MATCH(f.`name`) AGAINST('$search') *2) as relevance2 
FROM 
Find f left join Movie m on f.`tID`=m.`id` 
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) 
ORDER BY relevance1 + relevance2 DESC , length(f.Address) 
LIMIT 30 

上面的代碼夾頭只是想法,我無法驗證它運行沒有錯誤,因爲我沒有您的模式+數據。所以,只要玩它,看看你是否可以使它工作。然後比較你原來的代碼和這個代碼的執行計劃。我認爲應該有性能提升。

此外,如果您想獲得真正的相關數據,則不應使用IN BOOLEAN MODE作爲ORDER BY 中使用的相關性。如果匹配,則IN BOOLEAN MODE將始終返回1.0的相關性。但在WHERE我會使用匹配IN BOOLEAN MODE

HTH

PS。另一個想法是分別計算f.namem.text的匹配,然後建立適當的relevance1relevance2變量,並在WHEREORDER BY中使用它們。

+0

感謝您的回覆,但此查詢有錯誤「未知列'relevance1'在'where子句'」 – AmirHadi

+0

是的,意味着您無法從WHERE中的選擇列表中引用MATCH。因此,您必須在其中調用完整的MATCH,但請參閱您是否至少可以在ORDERY BY中重新使用relevance1和relevance2。 – andrews

+0

非常感謝你 它比以前快得多 – AmirHadi