Zai*_*sud 10 mongodb mongodb-indexes
我一直在研究MongoDB上的数组(多键)索引,我有以下问题,我无法找到很多文档:
子文档数组的索引
所以如果我有一个看起来像这样的数组字段:
{field : [
{a : "1"},
{b : "2"},
{c : "3"}
]
}
Run Code Online (Sandbox Code Playgroud)
我只是在查询field.a
和field.c
独立(不是两者一起),我相信我有以下选项之间进行选择:
db.Collection.ensureIndex({field : 1});
db.Collection.ensureIndex({field.a : 1});
db.Collection.ensureIndex({field.c : 1});
那就是:整个数组的索引; 或嵌入字段上的两个索引.现在我的问题是:
你是对的,如果你只查询字段数组中a的值,从某种意义上说,这两个索引将帮助你提高查询性能.
但是,看看以下3个查询:
> db.zaid.save({field : [{a: 1}, {b: 2}, {c: 3}] });
> db.zaid.ensureIndex({field:1});
> db.zaid.ensureIndex({"field.a":1});
#Query 1
> db.zaid.find({"field.a":1})
{ "_id" : ObjectId("50b4be3403634cff61158dd0"), "field" : [ { "a" : 1 }, { "b" : 2 }, { "c" : 3 } ] }
> db.zaid.find({"field.a":1}).explain();
{
"cursor" : "BtreeCursor field.a_1",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"field.a" : [
[
1,
1
]
]
}
}
#Query 2
> db.zaid.find({"field.b":1}).explain();
{
"cursor" : "BasicCursor",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
#Query 3
> db.zaid.find({"field":{b:1}}).explain();
{
"cursor" : "BtreeCursor field_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"field" : [
[
{
"b" : 1
},
{
"b" : 1
}
]
]
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使您为数组建立索引,第二个查询也没有索引,但第三个查询确实如此.根据您打算查询数据的方式选择索引与考虑索引本身是否符合您的需求一样重要.在Mongo中,如果不小心,索引的结构可以并且确实会对查询的性能产生很大的影响.我认为这解释了你的第一个问题.
你的第二个问题有点开放,但我认为答案再次取决于你对数据的查询方式.如果您只对匹配"fields.a"的值感兴趣,那么您应该在内存中为您可能需要的其他索引节省空间.但是,如果您同样有可能查询数组中的任何项目,并且您有理由确定该数组不会无限增长(从不在数组上索引,该数组可能会随着时间的推移而增长到未绑定的大小.一旦数组在BSON中达到1024字节,将无法索引文档.),那么你应该索引整个数组.这方面的一个例子可能是一张扑克牌手的文件,其中包含一个描述用户手中每张牌的阵列.
归档时间: |
|
查看次数: |
4482 次 |
最近记录: |