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 - 与查询不同不使用索引的主要内容,如果未能解决你的问题,请参考以下文章