【发布时间】:2017-09-11 12:16:04
【问题描述】:
我试图了解为什么 MongoDB 无法使用 here 中提到的索引交集。
我使用以下代码块在intersection 集合中插入了 10000 个文档:
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
for (var k = 0; k < 10; k++) {
for (var l = 0; l < 10; l++) {
db.intersection.insert({a:i, b:j, c:k, d:l});
}
}
}
}
然后创建了这3个索引:db.intersection.createIndex({ a })db.intersection.createIndex({ b : 1, c : 1 })db.intersection.createIndex({ d : 1 })
此时我期待db.intersection.find({a:1,b:2,d:4}) 使用三个索引之间的交集,即。 a_1, b_1_c_1, d_1
但事实并非如此,我可以看到获胜计划仅使用一个索引,d_1:
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"a" : {
"$eq" : 1
}
},
{
"b" : {
"$eq" : 2
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"d" : 1
},
"indexName" : "d_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"d" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"d" : [
"[4.0, 4.0]"
]
}
}
},
抱歉,我无法发布 allPlansExecution,因为它超出了正文字数限制
此外,db.inter.find({a:1,b:2}) 的获胜计划也仅使用一个索引,b_1_c_1。
有人可以解释一下这些结果吗? 演示索引交集的实际示例也会有所帮助。
【问题讨论】:
-
确实是在使用索引交集。请参阅
filter查询计划的一部分。a和b之间正在发生交集 -
有两个阶段,第一个是输入阶段
IXSCAN,它只使用d_1索引,然后执行FETCH阶段。这里没有涉及其他索引。
标签: mongodb indexing mongo-shell