在执行distinct时,MongoDB不会在某些字段上使用索引

时间:2015-10-17 13:35:01

标签: mongodb indexing distinct

我注意到MongoDB在查询字段上的不同值时不会使用索引。我将在某些领域使用它,但不会在其他领域使用它。

以下是例子:

db.product.createIndex({"_indexed.preventieve_mondzorg-max_bedrag_p_jr": 1});
db.runCommand({distinct: "product", key:"_indexed.preventieve_mondzorg-max_bedrag_p_jr"});

此查询不会使用在该字段上构建的索引,而是将进行完整的集合扫描。这就是它产生的东西:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 50,
    "numIndexesAfter" : 50,
    "note" : "all indexes already exist",
    "ok" : 1
}
{
    "values" : [
        "€ 250,- | 75%",
        "Geen dekking",
        "...",
    ],
    "stats" : {
        "n" : 33660,
        "nscanned" : 0,
        "nscannedObjects" : 33660,
        "timems" : 12531,
        "planSummary" : "COLLSCAN"
    },
    "ok" : 1
}

另一方面

db.product.createIndex({"free_choice.value": 1});
db.runCommand({distinct: "product", key:"free_choice.value"});

索引:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 50,
    "numIndexesAfter" : 50,
    "note" : "all indexes already exist",
    "ok" : 1
}
{
    "values" : [
        "gedeeltelijk",
        "geen",
        "ja"
    ],
    "stats" : {
        "n" : 4,
        "nscanned" : 4,
        "nscannedObjects" : 4,
        "timems" : 2,
        "planSummary" : "DISTINCT { free_choice.value: 1.0 }"
    },
    "ok" : 1
}

那么......这两个领域之间可能有什么不同?

这是一个错误,还是我做错了什么?

我在Ubuntu 14.04.3 LTS的Vagrant框中运行MongoDB 3.0.6

1 个答案:

答案 0 :(得分:0)

显然这是MongoDB核心的错误。或不当行为。 MongoDB不会对不同请求的虚线字段使用多键索引。

这是Mongo的回应:

  

独特优化使用特殊的索引访问阶段   将不同的索引键返回到其父级。在多键中   但是,不同的阶段必须检查null   或未定义的键。在null或undefined的情况下,它必须获取   完整文档,以消除字面空值与   由于缺少字段而为null。除非我们决定推迟   我们看到用户确实需要这个。

如果你真的想要这个功能,请在这里投票:SERVER-13298