【发布时间】:2021-11-02 21:21:19
【问题描述】:
我有 MongoDB 4.4 集群和一个数据库,其中包含 200k 个文档和 55 个用于不同查询的索引。
以下查询:
db.getCollection('tasks').find({
"customer": "gZuu5ZptDEtC6dq2Z",
"finished": true,
"$or": [
{
"scoreCalculated": {
"$exists": true
},
},
{
"workflowProcessed": {
"$exists": true
},
}
]
}).sort({
"scoreCalculated": -1,
"workflowProcessed": -1,
"createdAt": -1
})
平均执行时间不到 1 秒。 Explain.
但如果我将排序方向更改为
.sort({
"scoreCalculated": 1,
"workflowProcessed": 1,
"createdAt": 1
})
执行时间增长到几秒(最多 10 秒)。 Explain.
第一个解释显示使用了 apiGetTasks 索引。但是它具有升序排序,当我将排序方向变为升序时,我不明白为什么不使用它。使用降序添加相同的索引不会改变任何内容。
你能帮我理解为什么第二个查询这么慢吗?
【问题讨论】:
-
你能告诉我索引 apiGetTasks
-
当然@MoussabKbeisy
{ "scoreCalculated" : 1, "workflowProcessed" : 1, "createdAt" : 1 } -
您可以通过对 both 排序操作运行解释(使用“executionStats”模式)来了解为什么查询需要更长的时间。查看用于排序的索引。查询中的其他操作是什么?这些会影响使用或不使用的索引。
-
@prasad_ 我附上了用“allPlansExecution”为每个要提问的查询所做的解释。
-
根据您的解释结果,索引用于排序 - 在这两种情况下。
标签: mongodb indexing query-optimization