使用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
文档,同时它有一个索引。
我做错了吗?对于这种不同的我有更好的选择吗?
答案 0 :(得分:1)
正如Alex所说,显然MongoDB现在不支持这一点。 有一个未解决的问题: https://jira.mongodb.org/browse/SERVER-19507
答案 1 :(得分:-1)
只需删除前2个索引。你不需要它们。 Mongo可以在任何可能需要{type: 1, source: 1}
索引的查询中使用{type: 1}
。