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

Posted

技术标签:

【中文标题】MongoDB - 与查询不同不使用索引【英文标题】:MongoDB - distinct with query doesn't use indexes 【发布时间】: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 文档,同时它有一个索引。

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

【问题讨论】:

【参考方案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,但我认为它不会很快得到解决。

以上是关于MongoDB - 与查询不同不使用索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB索引

MongoDB查询优化

MongoDB 索引

mongodb 中不用$where的代替

MongoDB高效查询之索引机制

Spring Mongo 聚合查询以从 MongoDB 获取不同的国家名称和国家代码