关于mongodb中子集排序的澄清
我在mongodb中有字段关于mongodb中子集排序的澄清,mongodb,indexing,Mongodb,Indexing,我在mongodb中有字段a、b、c、d、e、p的文档。 我有{a:1},{b:1},{c:1},{d:1},{e:1},{p:1},以及复合索引{a:1,b:1,c:1}。 字段p表示字段的位置 如果我有这样一个选择:{a:'something',b:'something',c:'and reach'},我知道它肯定会使用索引{a:1,b:1,c:1}来搜索(显然) 但是,如果我想按p({p:1})进行排序,那么实际会使用索引对数据进行排序吗?我很担心,因为我可能有一个很大的数据集 我读了很多
a、b、c、d、e、p
的文档。
我有{a:1}
,{b:1},
{c:1},{d:1},
{e:1},{p:1}
,以及复合索引{a:1,b:1,c:1}
。
字段p
表示字段的位置
如果我有这样一个选择:{a:'something',b:'something',c:'and reach'}
,我知道它肯定会使用索引{a:1,b:1,c:1}
来搜索(显然)
但是,如果我想按p
({p:1}
)进行排序,那么实际会使用索引对数据进行排序吗?我很担心,因为我可能有一个很大的数据集
我读了很多书,但不能完全理解我的用例(尽管它可能在那里)最好说“MongoDB可以使用一个索引进行匹配,使用另一个索引进行排序吗?”答案是否定的
explain输出中要“查找”的内容是查看是否使用了索引进行排序,当索引无法使用时,该值将显示true
,如果可以,该值将显示false
考虑到您调整了示例,在“a”、“b”和“c”上有一个复合索引,在“p”上有一个单独的索引,然后是这样一个查询:
db.collection.find({a:a',b:b}).sort({p:1}).explain()
将显示复合索引用于查询,但未用于排序。但如果您创建了这样的索引:
ensureIndex({a:1,b:1,p:1})
然后将使用索引进行排序。以类似的方式,如果您创建了以下内容:
ensureIndex({p:1,a:1,b:1})
然后,也可以选择该索引,并通过sort操作进行选择,还可以将其用作排序。但效率不是很高,因为索引中将扫描a
和b
的所有值以确定结果
最后一个例子是非常少量的文档和您最初的复合选择,考虑到要扫描的文档数量很少,优化器可能只会选择“p”索引,而事实上,它可能只会使用该索引来影响排序操作。我希望优化器使用该索引,但是您应该能够通过使用
explain()
来验证它:我想您对实际数据的了解非常笼统,但是既然您提到了“positions”,那么这是否相关:因此,最好的方法是实际执行db.collection.ensureIndex({a:1,b:1,p:1})
,以确保m查询被索引。。。对吗?@Merc如果你的要求符合这样的要求,那么是的。尽量不要创建太多的索引或太多的复合字段,并限制您常用的字段。