MongoDB-与查询不相异';不要使用索引

MongoDB-与查询不相异';不要使用索引,mongodb,mongodb-query,Mongodb,Mongodb Query,使用Mongo3.2 假设我有一个具有此模式的集合: { _id: 1, type: a, source: x }, { _id: 2, type: a, source: y }, { _id: 3, type: b, source: x }, { _id: 4, type: b, source: y } 当然,我的数据库更大,有更多的类型和来源 我已经创建了4个类型和源的索引组合(尽管1个就足够了): 现在,我运行这个独特的查询: db.test.distinct("source", {ty

使用Mongo3.2

假设我有一个具有此模式的集合:

{ _id: 1, type: a, source: x },
{ _id: 2, type: a, source: y },
{ _id: 3, type: b, source: x },
{ _id: 4, type: b, source: y }
当然,我的数据库更大,有更多的类型和来源

我已经创建了4个类型和源的索引组合(尽管1个就足够了):

现在,我运行这个独特的查询:

db.test.distinct("source", {type: "a"})
问题是这个查询需要的时间比它应该需要的时间多得多。 如果我使用runCommand运行它:

db.runCommand({distinct: 'test', key: "source", query: {type: "a"}})
这是我得到的结果:

{
    "waitedMS": 0,
    "values": [
        "x",
        "y"
    ],
    "stats": {
        "n": 19400840,
        "nscanned": 19400840,
        "nscannedObjects": 19400840,
        "timems": 14821,
        "planSummary": "IXSCAN { type: 1 }"
    },
    "ok": 1
}
出于某种原因,mongo只为查询阶段使用
type:1
索引。 它还应在不同阶段使用索引。 为什么呢?使用
{type:1,source:1}
索引会更好,不是吗?现在它正在扫描所有的
type:a
文档,同时它还有一个索引


我做错什么了吗?对于这种不同的索引,我有更好的选择吗?

只需删除前两个索引即可。你不需要它们。Mongo可以在任何可能需要
{type:1}
索引的查询中使用
{type:1}

正如Alex提到的,显然MongoDB现在不支持这个。 有一个悬而未决的问题:

它不会改变结果。是的,它将使用{type:1,source:1}索引,但仅用于查询阶段,而不用于distinct阶段,因此时间和结果是相同的,它不会对distinct阶段使用索引,除非索引从键开始。在您的情况下,如果查询为空,则
{source:1}
可用于
DISTINCT\u SCAN
。我知道,但这不是我想要的。我想用一个查询来区分,所以它应该在
{type:1,source:1}
索引不可行的atm上使用
distinct\u SCAN
。你可以投票支持这张票,但我认为它不会很快得到解决。从这个问题来看,它应该在3.4中实现吗?@Alvin Wong你是对的,谢天谢地,这项功能已经在Mongo 3.4中实现了。
{
    "waitedMS": 0,
    "values": [
        "x",
        "y"
    ],
    "stats": {
        "n": 19400840,
        "nscanned": 19400840,
        "nscannedObjects": 19400840,
        "timems": 14821,
        "planSummary": "IXSCAN { type: 1 }"
    },
    "ok": 1
}