使用MongoDB Java驱动程序的索引无法提高性能

时间:2016-03-23 17:37:50

标签: java mongodb performance indexing

在我的数据库中,我有一个包含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);

经过多次测试,有或没有查询的性能是相同的。 我愿意提供有关我的运营的额外信息 explain命令给了我:

 {
    "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 个答案:

答案 0 :(得分:1)

在MongoDB中,如果希望索引用于不区分大小写的查询,则需要使用text index

答案 1 :(得分:1)

正如问题的评论中所述,当所有文档都不适合内存时,MongoDB变慢,当索引字段不适合内存时,它变得非常慢。这是因为MongoDB必须诉诸memory paging。这意味着MongoDB会在硬盘上保存一些内存,并且检索这个内容很慢。基本上,你正在失去索引字段的优势。

避免这种情况的策略是:

  • 增加服务器上的RAM量
  • 使用包含多台服务器的sharded configuration
  • 限制跨文档的数据重复
  • 限制索引字段

您可以使用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。