澄清mongodb中的子集排序

时间:2014-03-10 02:20:09

标签: mongodb indexing

我在mongodb中有字段a, b, c, d, e, p的文档。 我的索引为{ a: 1 }{ b: 1 }, {c:1},{ d: 1 }, {e:1},{ p: 1 },AS WELL为复合索引{ a: 1, b: 1, c: 1 }。 字段p表示字段的位置。

如果我有这样的选择:{ a: 'something', b: 'something else', c: 'and again' },我知道肯定会使用索引{ a: 1, b: 1, c: 1 }进行搜索(显然)。

但是,如果我想按p{ p: 1 })排序,是否会使用索引对数据进行排序?我很担心,因为我可能有一个大型数据集。

我看了http://docs.mongodb.org/manual/tutorial/sort-results-with-indexes/并且完全找不到我的用例(虽然它可能在那里)

1 个答案:

答案 0 :(得分:1)

可能最好的说法是“MongoDB可以使用一个索引来匹配而另一个索引要排序吗?”答案是否定的。

在解释输出中“查找”以查看索引是否用于排序的内容是scanAndOrder的值,当索引不能true strong>可以使用false

考虑到你修改了样本,在“a”,“b”和“c”上有一个复合索引,在“p”上有一个单独的索引,那么这样的查询:

db.collection.find( { a: "a", b: "b" }).sort({ p: 1 }).explain()

会显示复合索引用于查询,但未用于排序。但是如果你有一个像这样创建的索引:

db.collection.ensureIndex({a:1,b:1,p:1})

然后索引用于排序。以类似的方式,如果你这样创建:

db.collection.ensureIndex({p:1,a:1,b:1})

然后也可以选择该索引,并通过sort操作完成,也可以用作排序。但由于ab的所有值都将在索引中扫描以确定结果,因此效率不高。

在最后一个案例中,文档和原始复合选择的数量非常少,优化器很可能只选择“p”索引,因为少量文档可以扫描一个事实,它可能只是使用该索引来影响排序操作。