2

如果有一个查询在字段 a 和 b 上过滤,然后在 c 上排序,我是否需要为 a、b 和 c 构建单独的索引,还是应该实际构建 (a、b、c) 的复合索引?而且,查询中的序列是否应该与索引中的序列匹配?也就是说,如果查询中的过滤器序列是过滤器b,过滤器c,然后在a上排序,那么具有(b,c,a)的复合索引是否更好?

4

2 回答 2

2

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

索引参数的顺序确实很重要,尽管不一定像您在问题中提到的那样。

由于过滤首先发生,如果索引是 (c,b,a),它对于过滤不会很有用,特别是如果集合中有很多项目。用于排序的字段应在索引中最后指定。

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

如果 b 有 10,000 个可能的值,而 a 只有两个可能的值,则索引应该是 (b,a,c)。相反,如果 a 有更多可能的值,那么它可能应该是 (a,b,c)。如果这两个字段在从查询中删除文档的能力大致相同,那么它就没有那么重要了。

于 2012-02-01T07:38:42.190 回答
1

所有这些以及更多内容都在docs中得到了解答。请参阅有关复合索引的部分。

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

于 2012-02-01T07:09:04.363 回答