对于MongoDB,需要选择哪些字段来构建索引?

对于MongoDB,需要选择哪些字段来构建索引?,mongodb,indexing,compound-index,Mongodb,Indexing,Compound Index,如果有一个查询对字段a和b进行过滤,然后对c进行排序,那么我是否需要为a、b和c构建单独的索引,还是应该实际构建(a、b、c)的复合索引?另外,查询中的序列是否应该与索引中的序列匹配?也就是说,如果查询中的过滤器序列是过滤器b、过滤器c,然后是a上的顺序,那么是否最好使用(b、c、a)的复合索引?所有这些以及更多的问题都在。请参阅关于复合索引的部分 查询参数的顺序无关紧要。因为MongoDB当前每个查询只使用一个索引,所以您需要一个复合索引 索引参数的顺序确实很重要,尽管不一定与您在问题中提到的

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

所有这些以及更多的问题都在。请参阅关于复合索引的部分


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

因为MongoDB当前每个查询只使用一个索引,所以您需要一个复合索引

索引参数的顺序确实很重要,尽管不一定与您在问题中提到的方式有关

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

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


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

索引中字段的顺序确实很重要,特别是当一些字段用于筛选,而另一些字段用于排序时。索引字段的顺序很重要,正如您在回答中所解释的,但查询参数的顺序并不相同。给定索引{a:1,b:1}一个查询{b:“嗨”,a:23}将使用该索引。如果我有一个地理字段(假设它是c),并且我的查询看起来像-find(c在点1附近,a>5)。排序(b)?(c:2d,a:1,b:1)的复合索引是否有效?索引中c,a,b的顺序是否是适合查询的最佳顺序?