2017-09-14 116 views
0


這似乎是一個多餘的問題,但我找不到這個問題的正確答案。
我有一個超過50列的TableA。我正在實現一個搜索功能,用於在此表的大約10列中搜索查詢。表A包含超過一百萬行
爲此,我在這10列上創建了一個複合索引。
index (col1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10)
現在我分解用戶的查詢使用空間作爲正則表達式。即
$search_words = $search_query.split(' ');
並使用單個詞匹配我的搜索查詢。例如:
優化搜索查詢

SELECT something FROM tableA 
WHERE (MATCH (col_1, col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) 
AGAINST (' +word1* +word2* +word3* +word4* ' IN BOOLEAN MODE)) 

此查詢工作正常一般的搜索,但如果像 A E I O公司查詢個別字母用戶的搜索需要花費太多的時間。在這種情況下優化查詢或執行搜索的另一種方式的最佳方法是什麼?

+0

E.g.不要讓他們搜索myisam全文搜索的單個字符。將'ft_min_word_len'調整爲2,以便執行更好的全文搜索。如果你真的需要這樣做,那麼你應該考慮使用搜索引擎,例如'sphinxse'或'elasticsearch.'。 Mysql不能很好地處理它。 – abeyaz

+0

使代碼中的最小符號數。 爲什麼不把數據分割到其他表中。 是你真的需要把所有這些列在很多列。 我會創建3列的表格 id,pointer_to_item_or_product,search_word 你需要在搜索中找到一些序列嗎? –

+0

@abeyaz不能限制搜索,因爲它可以是一個有效的搜索,我不允許使用搜索引擎,如lucene,elasticsearch等,因爲它將在一段時間後實施。但直到那必須改進這個功能。 – Gaur93

回答

0

如果您向InnoDB的FULLTEXT提供了太短的字符串,它將返回零結果。所以...篩選出比innodb_ft_min_token_size短的字符串。

如有必要,請使用REGEXP '[[:<:]]A[[:>:]]分別測試它們以查找1個字母的單詞A

或把它們扔在一起。這將檢查唯一的1個字母的英文單詞:REGEXP '[[:<:]][AI][[:>:]]