在我的数据库中,我有一个包含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
}
答案 0 :(得分:1)
在MongoDB中,如果希望索引用于不区分大小写的查询,则需要使用text index。
答案 1 :(得分:1)
正如问题的评论中所述,当所有文档都不适合内存时,MongoDB变慢,当索引字段不适合内存时,它变得非常慢。这是因为MongoDB必须诉诸memory paging。这意味着MongoDB会在硬盘上保存一些内存,并且检索这个内容很慢。基本上,你正在失去索引字段的优势。
避免这种情况的策略是:
您可以使用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。