2012-02-01 85 views
2

如果有一个查询在字段a和b上进行过滤,然后在c上进行排序,那么是否需要为a,b和c构建单独的索引,还是应该实际构建(a,b,c)的复合索引)?此外,查询中的序列是否与索引中的序列匹配?也就是说,如果查询中的过滤器序列是过滤器b,过滤器c,然后在a上排序,那么最好是复合索引为(b,c,a)?在MongoDB中,需要选择哪些字段来构建索引?

回答

2

由于MongoDB目前每个查询只使用一个索引,因此您需要一个复合索引。

索引参数的顺序很重要,尽管不一定像你在问题中提到的那样。由于过滤首先发生,如果索引是(c,b,a),那么它对于过滤并不是很有用,特别是如果集合中有很多项目。应该在索引中最后指定用于排序的字段。

因此,索引应该是(a,b,c)或(b,a,c)。哪一个应该取决于选择性 - 换句话说,哪个字段会消除不匹配项更快的项目?

如果b有10,000个可能的值,并且a只有两个可能的值,那么索引应该是(b,a,c)。相反,如果a有更多可能的值,那么它可能应该是(a,b,c)。如果这两个字段在消除查询中文档的能力方面大致相同,那么它们无关紧要。

1

所有这些以及更多内容在docs中得到解答。请参阅复合索引章节。

查询参数的顺序无关紧要。

+0

索引中的字段顺序绝对*很重要,特别是当某些用于过滤时,以及一些用于排序。 – 2012-02-01 07:39:34

+0

当您在答案中解释时,索引字段的顺序很重要,但是查询参数的顺序不是。给定索引{a:1,b:1},查询{b:“hi”,a:23}将使用该索引。 – 2012-02-01 09:49:07

+0

如果我有一个地理区域(假设它是c)并且我的查询看起来像 - find(c附近的point1,a> 5).sort(b)? (c:2d,a:1,b:1)的复合索引是否起作用,并且索引中c,a,b的顺序是否适合查询的最佳顺序? – tom 2012-02-01 16:28:50