现在您将需要多个索引来执行此查询;毫无疑问。
问题是什么索引?
现在您必须考虑到,由于 MongoDB 查询优化器中的错误,您的任何人都无法使用索引以最佳方式对数据进行基本排序: https$or
://jira.mongodb.org/browse/SERVER- 1205 .
所以你知道$or
排序会有一些性能问题,并且将排序字段放入$or
子句索引是无用的atm。
因此,考虑到这一点,您想要的第一个索引是涵盖您正在执行的基本查询的索引。正如@Leonid 所说,您可以将其制成复合索引,但是,我不会按照他的顺序进行操作。相反,我会这样做:
db.col.ensureIndex({type:-1,deleted:-1,date.created:-1})
deleted
由于其超低的选择性,我完全不确定该字段是否在索引中;事实上,它可以在索引中而不是被取出来创建一个性能较低的操作(对于大多数数据库,包括 SQL 来说都是如此)。这部分需要您进行测试;也许该字段应该是最后一个(?)。
至于索引的顺序,我也只是猜到了。我已经对所有字段说了 DESC,因为您的排序是 DESC,但是您需要explain
自己在这里进行。
这样应该能够处理查询的主子句。现在来处理那些$or
s。
每个都$or
将单独使用一个索引,MongoDB 查询优化器也会为它们单独查找索引,就好像它们完全是单独的查询一样,所以这里值得注意的是关于复合索引的一些问题(http://docs.mongodb.org /manual/core/indexes/#compound-indexes)是它们在前缀上工作(这里的示例注释:http: //docs.mongodb.org/manual/core/indexes/#id5)所以你不能做一个单个复合索引覆盖所有三个子句,因此在$or
(考虑到上面的错误)上声明索引的更优化方法是:
db.col.ensureindex({creator._id:1});
db.col.ensureindex({aprent._id:1});
db.col.ensureindex({somrelation._id:1});
它应该能够让您开始为您的查询创建最佳索引。
但是,我应该强调,您需要自己进行测试。