mongodb:如何为不同的命令和查询使用索引?

mongodb:如何为不同的命令和查询使用索引?,mongodb,indexing,distinct,Mongodb,Indexing,Distinct,我对使用查询的非常慢的不同命令有一些问题。 根据我观察到的情况,distinct命令仅在未指定查询时使用索引: 我在MongoDB 3.0.10服务器上创建了一个测试数据库,其中包含1Mio对象。每个对象的外观如下所示: { "_id" : ObjectId("56e7fb5303858265f53c0ea1"), "field1" : "field1_6", "field2" : "field2_10", "field3" : "field3_29",

我对使用查询的非常慢的不同命令有一些问题。 根据我观察到的情况,distinct命令仅在未指定查询时使用索引

我在MongoDB 3.0.10服务器上创建了一个测试数据库,其中包含1Mio对象。每个对象的外观如下所示:

{
    "_id" : ObjectId("56e7fb5303858265f53c0ea1"),
    "field1" : "field1_6",
    "field2" : "field2_10",
    "field3" : "field3_29",
    "field4" : "field4_64"
}
字段值末尾的数字是随机的0-99

在集合上创建了两个简单索引和一个复合索引:

{ "field1" : 1 } # simple index on "field1"
{ "field2" : 1 } # simple index on "field2"
{                # compound index on all fields
    "field2" : 1,
    "field1" : 1,
    "field3" : 1,
    "field4" : 1
}
现在,我在该数据库上执行不同的查询:

db.runCommand({ distinct: 'dbtest',key:'field1'})
结果包含100个值,nscanned=100,并且在“field1”上使用了索引

现在,同一个不同的查询受到以下查询的限制:

db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含100个值,但是nscaned=9991,并且使用的索引是所有字段中的第三个索引

现在删除了上次查询中使用的第三个索引。再次执行最后一个查询:

db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含100个值,nscanned=9991,使用的索引是“field2”索引

结论:如果我在没有查询的情况下执行一个独特的命令,结果将直接从索引中获取。但是,当我将distinct命令与查询组合时,仅查询使用索引,在这种情况下distinct命令本身不使用索引

我的问题是,我需要在一个非常大的数据库上执行带有查询的独特命令。结果集非常大,但仅包含约100个不同的值。因此,完整的distinct命令需要时间(>5分钟),因为它必须在所有值之间循环


需要做些什么才能执行上面介绍的可由数据库直接从索引回答的distinct命令?

在distinct查询中使用索引的可能性需要Mongo 3.4版或更高版本-它适用于两个存储引擎MMAPv1/WiredTiger


另请参见mongo中目前不支持的错误记录,重复:Thanke,这解释了很多。有一个包含数据的“数据库”,索引良好,而“数据库”忽略了索引,这真是太棒了。也许有人应该重新考虑将Mongo称为数据库……这并没有回答我不同意的问题——问题是“我们如何在不同的查询中使用索引”,给出的答案是“升级到Mongo 3.4”。你期望得到什么答案?该问题明确指出,必要的索引已经存在。问题是“如何使用索引…”,而不是“索引”。我个人在寻找关于如何定义索引以使用distinct命令(字段顺序,利用包含的查询)的描述,因为它没有文档记录。这可能是问题的标题,而不是答案。别忘了标题不是问题本身。我举了一个什么不起作用的例子,由此产生的问题是如何使它与索引一起工作。你真的应该花点时间阅读完整的问题——如果它与你的问题不匹配,那就不是答案的问题。答案应该在问题的上下文中解释,而不是在你试图做什么的上下文中解释。@Max我添加了错误通知单的链接。