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