MongoDB是否对索引字段的distincts或count使用索引?

MongoDB是否对索引字段的distincts或count使用索引?,mongodb,Mongodb,有些查询在一个相对较小的集合(约200000个文档)上的速度令人怀疑,即使查询中唯一的字段是索引字段。e、 g.(使用Java驱动程序): 大约需要三秒钟的时间,在shell中coll.distinct(“主机”)。尽管主机已被索引,但长度大约需要两秒钟: coll.getIndexes() 上面的查询不使用主机索引的原因是什么?不幸的是,explain()在distinct上似乎不起作用,所以我只能假设这就是原因。这是在MongoLab上运行的v2.2.4版本。(另外,虽然2秒或3秒看起来

有些查询在一个相对较小的集合(约200000个文档)上的速度令人怀疑,即使查询中唯一的字段是索引字段。e、 g.(使用Java驱动程序):

大约需要三秒钟的时间,在shell中
coll.distinct(“主机”)。尽管主机已被索引,但长度大约需要两秒钟:

coll.getIndexes()

上面的查询不使用主机索引的原因是什么?不幸的是,explain()在distinct上似乎不起作用,所以我只能假设这就是原因。这是在MongoLab上运行的v2.2.4版本。(另外,虽然2秒或3秒看起来不算多,但如果API在返回之前运行了3或4个这类查询,那么这些查询就加起来了……更不用说最终的数据库大小增长了)。有没有办法强制使用索引或以其他方式加速计数查询

db.runCommand({distinct : 'eventReportColl', key : 'host'})

这将为您提供查询解释。您可以检查使用了哪个索引,或者“n”、“nscanned”、“nscannedObjects”是多少。这将帮助您理解为什么查询速度慢。

字段的基数是多少?还有什么例子?你确定这不是真的在拖你的后腿吗?关于基数,这个字段在集合中约20万个文档中有8万个unique(所有文档都有这个字段)。MongoLab实例是免费层(我们的开发数据库),但我不认为这是问题所在,因为我们有一个付费实例(共享单节点小),所以我运行了上面的操作,驱动程序需要4秒以上的时间,shell需要3秒以上的时间(这并不奇怪,因为这是一个更大的数据集)。谢谢,看起来它正在使用一个索引,考虑到它有多慢,这是令人惊讶和悲哀的。看起来MongoDB可能不适合我们的需要。此查询必须至少扫描“主机”索引的所有索引元素。而且这个操作不会那么快(还取决于有多少索引缓存在RAM中)。如果此类查询的频率很高,那么最好有一个单独的计数器,在每次插入期间进行计算。
{
  "v" : 1,
  "key" : {
    "host" : 1
  },
  "ns" : "db.event_reports",
  "name" : "host_1"
}
db.runCommand({distinct : 'eventReportColl', key : 'host'})