【问题标题】:MongoDB - distinct with query doesn't use indexesMongoDB - 与查询不同不使用索引
【发布时间】:2016-03-15 08:39:32
【问题描述】:

使用 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 文档,同时它有一个索引。

我做错了吗?对于这种独特的,我有更好的选择吗?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    正如 Alex 所提到的,显然 MongoDB 目前不支持此功能。 它有一个未解决的问题: https://jira.mongodb.org/browse/SERVER-19507

    【讨论】:

    • 从问题来看,好像应该在3.4中实现了?
    • @Alvin Wong 你是对的,谢天谢地这个功能已经在 Mongo 3.4 中实现了。
    【解决方案2】:

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

    【讨论】:

    • 它不会改变结果。是的,它将使用 {type: 1, source: 1} 索引,但仅用于查询阶段,而不用于不同阶段,因此时间和结果是相同的
    • 它不使用不同阶段的索引,除非索引从键开始。在您的情况下,如果查询为空,{source: 1} 可用于DISTINCT_SCAN
    • 我知道,但这不是我想要的。我想用一个查询来区分,所以它应该在{type: 1, source: 1}索引上使用DISTINCT_SCAN
    • ATM 不可行。你可以投票给票jira.mongodb.org/browse/SERVER-19507,但我认为它不会很快得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2010-11-06
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多