2015-05-09 212 views
1

我們目前正在MySQL上運行我們的應用程序,並計劃遷移到MongoDB。我們已經移動了一些部分,但在MongoRegex性能方面存在問題。MongoDB搜索 - 自動完成

我們有一個自動完成搜索框,可以連接6個表(索引/非索引字段)並在mysql上返回結果超快。 MongoDB上的相同事情執行起來非常慢。它只需要一個集合約2.3秒。用戶必須等待很長時間。連接時間爲0.064秒。查詢時間2.36秒。我做了一些谷歌搜索,找不到完美的答案。大家都說MongoRegex很慢。如果那是真的,其他公司如何克服這個問題呢?

在MongoDB上運行時改進自動完成性能/體驗的最佳方式是什麼?

+0

由於這是用於某種「自動完成」功能,所以您的模式前綴爲固定字符串。就像'Mongo。*'/'Mongo%'。所以,作爲一個瘋狂的猜測,_maybe最終may_ MySQL將優化RE/LIKE搜索時,左前綴是不變的使用索引。 _最終可能_ MongoDB無法達到同樣的效果?你在這個領域有適當的索引嗎? –

+0

[使用MongoDB搜索實現自動完成功能]可能的重複(http://stackoverflow.com/questions/29892947/implement-auto-complete-feature-using-mongodb-search) –

回答

0

很難說,因爲我們沒有搜索查詢,但值得一提的是,在看過文檔後,看起來MongoDB能夠在使用RE搜索時使用索引,如果模式是由常量字符串前綴,只有當它被固定

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

所以,引用文檔:

正則表達式是一個「前綴表示」如果它與一個插入符號開始(^)或a左錨(\ A),後跟一串簡單的符號。例如,正則表達式/^abc.*/將通過匹配僅與從abc開始的索引中的值進行匹配。

但是/abc.*//^.*abc/不會使用該索引。

+0

如果它是一個標準的正則表達式,這也應該這樣做:'/^abc /' –

+0

@Rick哦是的。當然,任何前綴表達式都可以工作。 –

0

首先,你將不得不仔細設計你的查詢。小心地選擇合適的索引字段並進行相應的設計。此外,如果您使用的是正則表達式,請確保您以強制查詢使用索引字段的方式編寫正則表達式。像/ ^前綴/將做。 [見這個鏈接:http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use]

我見過很多使用mongodb範圍查詢的實現,但林不知道這是否是最好的,因爲即時結果是一個關鍵的事情。

除此之外,我見過一些推薦前綴樹的人。它將前綴有效地存儲在一個字段中,然後將以該特定前綴開頭的所有單詞作爲數組存儲在下一個字段中。這個解決方案聽起來很有說服力和快速,因爲前綴字段應該被索引,但是你也必須考慮存儲因素。