2016-03-23 93 views
1

在我的數據庫,我有100K的文件具有以下結構的指標:指標與MongoDB的Java驅動程序不能提高性能

{ "_id" : ObjectId("56f2ce94ef4c3043f12141b8"), "a" : "aaaa", "b" : "bbbb", "c" : "cccc" ...} 

在Java中,插入後,我調用該函數:

myCollection.createIndex(new Document("a", 1)); 

,並以查詢:

FindIterable<Document> iterable = 
DB.getCollection(collection).find(dbobj); 

經過多次試驗,性能有或沒有查詢一樣。 我很樂意提供有關我的操作的額外信息。
的解釋命令給我:

{ 
    "queryPlanner" : { 
     "plannerVersion" : 1, 
     "namespace" : "db.MyCollection", 
     "indexFilterSet" : false, 
     "parsedQuery" : { 
      "a" : /^aaaa.*/i 
     }, 
     "winningPlan" : { 
      "stage" : "FETCH", 
      "inputStage" : { 
       "stage" : "IXSCAN", 
       "filter" : { 
        "a" : /^aaaa.*/i 
       }, 
       "keyPattern" : { 
        "a" : 1 
       }, 
       "indexName" : "a_1", 
       "isMultiKey" : false, 
       "isUnique" : false, 
       "isSparse" : false, 
       "isPartial" : false, 
       "indexVersion" : 1, 
       "direction" : "forward", 
       "indexBounds" : { 
        "Modality" : [ 
         "[\"\", {})", 
         "[/^aaaa.*/i, /^aaaa.*/i]" 
        ] 
       } 
      } 
     }, 
     "rejectedPlans" : [ ] 
    }, 
    "ok" : 1 
} 
+2

「dbobj」中的查詢如何? – jarnbjo

+0

使用MongoDB控制檯的速度是否相同?如果是這樣,你可以在你的查詢上運行[解釋](https://docs.mongodb.org/manual/reference/method/cursor.explain/)命令嗎? – CydrickT

+0

請提供更多詳情。你能顯示確切的文件和確切的查詢?你能描述領域的基數嗎(即有多少不同的價值觀索引領域通常有)?數據大小和服務器有多少內存? – Roman

回答

1

正如問題的評論所述,當所有文檔都不適合內存時,MongoDB會變慢,當索引字段不適合內存時,它會變得非常慢。這是因爲MongoDB不得不求助於memory paging。這意味着MongoDB會在硬盤上保存一些內存內容,並且檢索速度很慢。基本上,你失去了索引字段的優勢。

策略,以避免是:

  • 增加你有你的服務器
  • 上的RAM量使用含有sharded configuration多個服務器跨文檔
  • 限制數據重複
  • 限制的索引字段

您可以觀察到由MongoDB佔用的內存量在MongoDB控制檯上唱出db.my_collection.stats()命令。這應該是輸出:

{ 
    "ns" : "guidebook.restaurants", 
    "count" : 25359, 
    "size" : 10630398, 
    "avgObjSize" : 419, 
    "storageSize" : 4104192 
    "capped" : false, 
    "wiredTiger" : { 
     "metadata" : { 
      "formatVersion" : 1 
     }, 
     [...] 
     "nindexes" : 4, 
     "totalIndexSize" : 626688, 
     "indexSizes" : { 
     "_id_" : 217088, 
     "borough_1_cuisine_1" : 139264, 
     "cuisine_1" : 131072, 
     "borough_1_address.zipcode_1" : 139264 
     }, 
     "ok" : 1 
} 

storageSize示出的存儲器中的字節,用於存儲文件的數量,並totalIndexSize示出的存儲器用來索引值存儲在字節量。您可以看到哪些索引字段佔用indexSizes子文檔中的大部分空間。

理想情況下,你想擁有比storageSize + totalIndexSize更多的內存,但是你真的應該擁有比totalIndexSize更多的內存。

1

在MongoDB中,你需要使用一個text index,如果你想使用不區分大小寫的查詢索引。

+0

你能解釋一下爲什麼你認爲我需要不區分大小寫的查詢?我無法使用文本索引,因爲:「一個集合最多隻能有一個文本索引」,我至少需要四個字段進行索引。 –

+0

@AndréAlves因爲你使用的'i'選項意味着不區分大小寫:https://docs.mongodb.org/manual/reference/operator/query/regex/ – jarnbjo

+0

謝謝,我會測試沒有「我」選項,如果性能提高我驗證你的答案 –