【问题标题】:Slow mongodb query on changing sort direction改变排序方向的慢mongodb查询
【发布时间】: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


【解决方案1】:

请分享索引。
55 个索引太多了,您应该减少它,因为它会损害您的性能(每次您想要使用索引时,您都需要将其加载到 RAM 中,而不是让 Mongo 利用 RAM 来优化查询)。
此外,已灭绝的文档总数为 210780,这是您的全部收藏。因此,您需要重新考虑如何构建有效的索引来帮助您优化查询。
阅读 Mongo 索引文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2013-10-09
    相关资源
    最近更新 更多