MongoDB - 与查询不同,不使用索引

时间:2016-03-15 08:39:33

标签: mongodb mongodb-query

使用Mongo 3.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应该足够):

{type: 1}
{source: 1},
{type: 1, source: 1},
{source: 1, type: 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文档,同时它有一个索引。

我做错了吗?对于这种不同的我有更好的选择吗?

2 个答案:

答案 0 :(得分:1)

正如Alex所说,显然MongoDB现在不支持这一点。 有一个未解决的问题: https://jira.mongodb.org/browse/SERVER-19507

答案 1 :(得分:-1)

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