这个问题涉及管理索引和整理Bson文档的内部方法。
当您创建多个索引(如“index1”,“index2”,“index3”...)时,将存储索引以在查询期间使用,但查询的顺序和所产生的性能如何。
样品
索引1,索引2,INDEX3 ---->以相同的顺序查询index1,index2,index3(最佳情况)
索引1,索引2,INDEX3 ---->以另一个顺序查询index2,index1,index3(订单已更改)
很多时候您使用嵌套查询,包括这3个索引和其他项目或更多索引。查询的顺序会导致一些时间丢失?必须传递关于定义的索引顺序的查询或内部架构是否关注此订单搜索?我想知道我是否注意到这一点,或者可以自由地提出自己的疑问。
感谢。
答案 0 :(得分:36)
查询中条件的顺序不会影响它是否可以使用索引。
e.g。 典型的文档结构:
{
"FieldA" : "A",
"FieldB" : "B"
}
如果A和B上有复合索引:
db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1})
然后,以下两个查询都可以使用该索引:
db.MyCollection.find({FieldA : "A", FieldB : "B"})
db.MyCollection.find({FieldB : "B", FieldA : "A"})
因此,查询中条件的排序不会阻止使用索引 - 我认为这是您要问的问题。
您可以通过在shell中尝试2个查询并在查找后添加.explain()
来轻松测试此问题。我这样做是为了确认,他们都表明使用了复合指数。
但是,如果您运行以下查询,则不会使用索引,因为未查询FieldA:
db.MyCollection.find({FieldB : "B"})
因此,它是索引中字段的顺序,用于定义查询是否可以使用它,而不是查询本身中字段的顺序(这是Lucas所指的)。
答案 1 :(得分:11)
来自http://www.mongodb.org/display/DOCS/Indexes:
如果您有复合索引 多个字段,您可以使用它 查询的开头子集 领域。所以如果你有一个索引
A,B,C
你可以在
上使用它查询a
a,b
A,B,C
所以是的,订单很重要。如果您需要更精确的答案,您应该稍微澄清一下您的问题。
答案 2 :(得分:0)
是的,就像MySQL索引一样.MongoDB索引的实现与MySQL相同。详细信息可以看http://en.wikipedia.org/wiki/B-tree。