我想在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不是數據發現的最佳工具。我假設MySQL和Postgresql一樣快,因爲我們在其他項目中大量使用MySQL 2)我喜歡使用標記化的「findable_registering_organization」字段。但是,如果我沒有錯,我會放棄這種方法中通配符的排序屬性。我認爲這是一個可以適應的折衷方案(3)我可以利用像lucene這樣的FTS來更好地實現通配符搜索 – nir
關於Mongo $ OR查詢還有一件事。我只用多個語句運行$ OR查詢。根據文檔,查詢應該並行運行,但我沒有看到它並行運行。雖然我在Mongo服務器上有16個內核,但我只能看到一個正在使用的內核! – nir