2013-08-19 47 views
0

我想在java驅動程序上運行一些基於mongo集羣的通配符/正則表達式查詢。 蒙戈副本集配置: 3成員副本 16 CPU(超線程),24G內存的Linux x86_64的 集合尺寸:6M行,7G數據Mongodb查詢優化 - 並行運行查詢

客戶是本地主機(MAC OSX 10.8)與最新的蒙戈-Java驅動程序

查詢使用Java驅動程序與readpref = primaryPreffered

{ "$and" : [{ "$or" : [ { "country" : "united states"}]} , { "$or" : [ { "registering_organization" : { "$regex" : "^.*itt.*hartford.*$"}} , { "registering_organization" : { "$regex" : "^.*met.*life.*$"}} , { "registering_organization" : { "$regex" : "^.*cardinal.*health.*$"}}]}]} 

我有兩個 「國家」 和 「registering_organization」 普通索引。但是根據mongo文檔,一個查詢只能使用一個索引,我可以從上面的查詢的explain()中看到。

所以我的問題是什麼是在上述查詢中實現更好性能的最佳選擇。 我應該打破'和'的操作,並做記憶交叉。更進一步,我將在查詢中進行「不」操作。

我認爲我的應用程序可能會在未來轉爲報告/分析,但這並不意味着我們不會相應地進行設計。

回答

1

這個查詢有很多錯誤。

您的嵌套條件和正則表達式在MongoDB中永遠不會變得更快。 MongoDB並不是「數據發現」的最佳工具(例如,用於發現未知信息的特設多條件查詢)。當你知道你正在生成的指標時,MongoDB正在快速發展。但是,不適用於數據發現。

如果這是您正在運行的常見查詢,那麼我會創建一個名爲「united_states_or_health_care」的屬性,並將該值設置爲創建日期的時間戳。使用這種方法,您可以將邏輯從查詢移至文檔模式。這是考慮使用MongoDB進行擴展的一種常見方式。

如果你正在做數據發現,你有幾個不同的選擇:

  • 讓應用程序串聯不同的查詢
  • 運行查詢在二次MongoDB的結果,並接受性能下降
  • 使用mosql將數據傳輸到Postgresql。 Postgres將更快地運行這些數據發現查詢。

另一個提示:

你的正則表達式不以固定的方式要快。最好通過「findable_registering_organization」過濾器來運行「registering_organization」屬性。過濾器會將組織分解爲可查詢名稱子集的數組,並且您會使用正則表達式。如果您可以通過行業查詢過濾傳入名稱,則爲+2分。

+0

1)我同意MongoDB不是數據發現的最佳工具。我假設MySQL和Postgresql一樣快,因爲我們在其他項目中大量使用MySQL 2)我喜歡使用標記化的「findable_registering_organization」字段。但是,如果我沒有錯,我會放棄這種方法中通配符的排序屬性。我認爲這是一個可以適應的折衷方案(3)我可以利用像lucene這樣的FTS來更好地實現通配符搜索 – nir

+0

關於Mongo $ OR查詢還有一件事。我只用多個語句運行$ OR查詢。根據文檔,查詢應該並行運行,但我沒有看到它並行運行。雖然我在Mongo服務器上有16個內核,但我只能看到一個正在使用的內核! – nir