簡體   English   中英

MongoDB Java驅動程序的索引無法提高性能

[英]Indexes with MongoDB Java Driver not improving performance

在我的數據庫中,我有一個包含以下結構的100K文檔的索引:

{ "_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
}

在MongoDB中,如果要將索引用於不區分大小寫的查詢,則需要使用文本索引

如問題評論中所述,當所有文檔都無法容納在內存中時,MongoDB會變慢,而當索引字段無法容納在內存中時,MongoDB會變得非常慢。 這是因為MongoDB必須訴諸內存分頁 這意味着MongoDB在您的HDD上保存了部分內存內容,並且檢索速度很慢。 基本上,您將失去擁有索引字段的優勢。

避免這種情況的策略是:

  • 增加服務器上的RAM量
  • 使用包含多個服務器的分片配置
  • 限制跨文檔的數據重復
  • 限制索引字段

您可以使用MongoDB控制台上的db.my_collection.stats()命令來觀察MongoDB占用的內存量。 這應該是輸出:

{
   "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更多的RAM,但實際上您應該擁有比totalIndexSize更多的RAM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM