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

时间:2016-03-15 12:36:06

标签: mongodb indexing distinct

我在使用查询的非常慢的不同命令时遇到了一些问题。 根据我的观察,如果您没有指定查询,则distinct命令仅使用索引

我在带有1Mio对象的MongoDB 3.0.10服务器上创建了一个测试数据库。每个对象如下所示:

{
    "_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,并且在#34; field1"上使用了索引。

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

db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})

它再次包含100个值,但nscanned = 9991,所使用的索引是所有字段的第三个。

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

db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})

它再次包含100个值,nscanned = 9991,使用的索引是" field2"之一。

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

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

执行上面提到的可以由数据库直接从索引回答的不同命令需要做什么?

1 个答案:

答案 0 :(得分:2)

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