【发布时间】:2020-10-09 18:17:32
【问题描述】:
Mongo DB 版本 3.4.6
我有一个文档结构类似于以下内容的集合:
{
organization: "ABC123",
tags: ["MARTHA WASHINGTON", "+15552082000"],
updatedAt : ISODate("2020-10-09T17:19:44.861Z"),
createdAt : ISODate("2020-01-14T19:46:15.957Z"),
}
我需要能够按组织和标签数组上的正则表达式“开头”进行查询,并且可以选择按updatedAt 或createdAt 排序。为此,我创建了以下索引:
{
"organization" : 1,
"tags" : 1,
"createdAt" : -1
}
这是一个多键复合索引,根据我对 Mongo 的理解,它应该允许我涵盖所有情况下的查询。如果我执行如下查询:
db.getCollection('data').find({"organization": "ABC123", "search": /^MARTHA WASHINGTO/})
查询被索引覆盖 - 我看到一个 FETCH/IXSCAN 阶段。
同样,如果我删除正则表达式查询并添加排序 - 查询将被完美覆盖。
db.getCollection('data').find({"organization": "ABC123", "search": "MARTHA WASHINGTON"}).sort({"createdAt":-1})
但是,如果我结合正则表达式和排序选项,我会突然在查询中看到一个额外的 SORT 阶段。示例查询:
db.getCollection('data').find({"organization": "ABC123", "search": /^MARTHA WASHINGTO/}).sort({"createdAt":-1})
这是解释中的获胜计划输出:
"winningPlan" : {
"stage" : "SORT",
"sortPattern" : {
"createdAt" : -1.0
},
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"organization" : 1,
"tags" : 1,
"createdAt" : -1
},
"indexName" : "tag matches by organization",
"isMultiKey" : true,
"multiKeyPaths" : {
"organization" : [],
"search" : [
"search"
],
"createdAt" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"organization" : [
"[\"ABC123\", \"ABC123\"]"
],
"tags" : [
"[\"MARTHA WASHINGTON\", \"MARTHA WASHINGTOO\")",
"[/^MARTHA WASHINGTON/, /^MARTHA WASHINGTON/]"
],
"createdAt" : [
"[MaxKey, MinKey]"
]
}
}
}
}
},
我很困惑为什么这个查询组合没有被索引覆盖。我的理解是,一开始的额外排序阶段会导致大型集合的性能下降。任何人都可以提供一些指导吗?我错过了一些限制吗?
更新:删除正则表达式查询时的获胜计划
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"organization" : 1,
"search" : 1,
"createdAt" : -1
},
"indexName" : "tag matches by organization",
"isMultiKey" : true,
"multiKeyPaths" : {
"organization" : [],
"search" : [
"search"
],
"createdAt" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"organization" : [
"[\"ABC123\", \"ABC123\"]"
],
"tags" : [
"[\"MARTHA WASHINGTON\", \"MARTHA WASHINGTON\"]"
],
"createdAt" : [
"[MaxKey, MinKey]"
]
}
}
},
【问题讨论】:
-
覆盖查询的查询计划是什么?
-
@D.SM - 我已根据您的要求添加了获胜计划
-
刚看到版本号 - 请在 4.4.1 上测试。
-
我认为在这种情况下版本号无关紧要。
标签: mongodb mongodb-query