【问题标题】:How to properly optimize a query in mongodb?如何正确优化 mongodb 中的查询?
【发布时间】:2021-04-28 06:00:42
【问题描述】:

有以下类型的查询需要很长时间(在数百万条记录的集合中),索引设置在_id和cpe_id字段上,状态。如何理解 $ in 运算符中的问题,由于搜索的增加,也因为集合很大,因为我有复杂度 O (N * logM),其中 N 是 in 的长度,M 是 in 的元素数集合。是否有任何选项可以以某种方式提高查询的性能?

db.collection.aggregate([
    {$match :
        {"cpe_id" :
            {$in : ["e389439e-bd04-f3fb-c512-00193b0c4385","d389439e-bd04-f3fb-c512-00193b13d00c"....]}
        }
    },
        {$sort : {state: 1, _id : 1}},
        {$skip : 0},
        {$limit : 100},
    ])

【问题讨论】:

    标签: database mongodb mongodb-query aggregation-framework


    【解决方案1】:

    $in 运算符可以通过查询字段上的索引有效地服务,即{cpe_id: 1}

    就性能而言,它需要为提供的数组中的每个值扫描索引的一个区域。我希望该部分与数组大小成线性关系。

    排序也可以使用索引来完成,但是MongoDB只能使用一个索引来进行排序,而且它必须是用来选择文档的同一个索引。

    如果没有可以同时用于两者的单一索引,它将首先找到所有匹配的文档,将它们加载到内存中,对它们进行排序,然后才应用跳过和限制。

    如果{cpe_id: 1, state: 1, _id: 1}{state: 1, _id: 1, cpe_id: 1} 上有索引,则查询规划器可以使用多种优化:

    • 使用索引选择文档,因此不会加载不匹配的文档
    • 由于索引中的值已经按所需顺序排序,因此可以省略内存排序
    • 如果没有阻塞排序,在找到(跳过 + 限制)文档后,执行可能会停止。

    您可以使用带有“allPlansExecution”选项的db.collection.explain shell 帮助程序或explain 命令来查看考虑了哪些索引,以及每个索引的执行情况。

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2015-01-21
      • 2015-01-09
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多