mongodb $lookup是超级慢,尽管从集合是空的

m1m5dgzv  于 2023-05-17  发布在  Go
关注(0)|答案(1)|浏览(388)

基本集合有100,000个文档。所有这些都将通过$lookup阶段运行。将在中查找的集合为空。
此查询需要30秒。
当我删除$lookup stage时,这个查询需要3秒。
什么解释为什么它是如此缓慢,尽管外国集合是空的,没有文件?
即使它有文档,也有管道的索引。
编辑:
$lookup是动态的,这意味着它需要为100,000个文档中的每个文档匹配不同的值。
explain():

"$lookup": {
         from: ....
      },
      ....           
      "totalDocsExamined": 0,
      "totalKeysExamined": 0,
      "collectionScans": 0,
      "indexesUsed": [
        "A_1_B_1_C_1"
      ],
      "nReturned": 100000,
      "executionTimeMillisEstimate": 35602
    },
ilmyapht

ilmyapht1#

explain plan清楚地表明所花费的时间大约为35秒,返回的文档为100000
这背后的一个原因是$lookup是为基本集合的每个文档计算的。即使联接的集合是空的,lookup仍然会对每个文档发生,在这种情况下,不可能有任何内部查询优化。您唯一能做的就是在$lookup之前使用$match过滤一些文档。使用$lookup将一个完整的集合与另一个完整的集合连接起来,不会随着集合大小的增长而扩展。

相关问题