我在理解复合索引的基本概念时遇到了麻烦。假设我有一个具有此模式的集合:
{
_id: 1,
field1: 'aaa',
field2: 'bbb',
field3: 'ccc'
}在https://docs.mongodb.org/manual/core/index-compound/中,它清楚地说明了,而且我理解,这个索引:{ field1: 1, field: 2}将只支持在field1和两个field1 AND field2上的查询,这是有意义的。
现在,如果我想要支持对所有字段(1,2和3)的查询,其中字段1总是被使用,该怎么办?我想支持在所有field1 AND field2 AND field3上查询field1 AND field2和field1 AND field3的选项。
我知道可以为这些查询选项中的每一个创建复合索引,但问题是是否可以使用更少的复合来在相同的性能下进行查询。
例如,如果我有一个索引:{field1: 1, field2: 1, field3: 1},并且我查询field1 AND field3,它将使用这个索引,但是field2上的索引边界将是"[MinKey, MaxKey]"。是否值得创建另一个索引:{field1: 1, field3: 1}
发布于 2016-03-23 18:44:23
如果您尝试创建一个包含这些文档和索引的集合,然后对查询执行explain,mongo将选择索引:{field1: 1, field3: 1}并拒绝其他计划。这表明mongo发现一个索引比另一个索引更可取。
例如,explain返回以下内容:
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field3" : 1
},
"indexName" : "field1_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"field3" : {
"$eq" : "ccc"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1
},
"indexName" : "field1_1_field2_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
]
}
}
},
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1,
"field3" : 1
},
"indexName" : "field1_1_field2_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
}
]然而,这里存在索引大小的问题,以及您要创建的所有索引是否都可以与数据库工作集一起放入RAM中。如果它们没有,那么它将在磁盘上保存索引,这将大大减慢读取速度。最好的折衷办法是在所有三个字段上都使用索引,因为这总比没有索引好,而且涉及的维护工作也比三个索引少
https://stackoverflow.com/questions/36175485
复制相似问题