很少和非常小的文档上的MongoDB查找聚合速度很慢

Jiv*_*van 5 mongodb mongoengine mongodb-query aggregation-framework

关于其中一个或两个案例的慢速MongoDB聚合,有很多问题:

  • 要检索的大量文档
  • 非常大的文件

令我困扰的是,在我正在设置的原型中,我的查询始终非常缓慢,其中:

  • 要检索的文档不超过10个
  • 每个文档不超过300字节的信息

使用查找聚合

此查询lookup对要检索的主文档执行聚合,并且这样写(使用Python的MongoEngine)

author_lookup = {
    '$lookup': {
        'from': 'users',
        'localField': 'author_id',
        'foreignField': '_id',
        'as': 'author'
     }
}

cursor = post_collection.Post.objects.all().aggregate(author_lookup)
Run Code Online (Sandbox Code Playgroud)

冒着重复自己的风险,就像这个原型的当前状态一样,Post要检索的文档不超过10个,可能Author需要查找3个文档.

以下是此查询连续5次点击的定时结果:

1.9418830871582031 seconds
3.0417070388793945 seconds
2.1725950241088867 seconds
1.3020501136779785 seconds
3.728671073913574 seconds
Run Code Online (Sandbox Code Playgroud)

很慢,mm?

没有查找聚合

现在,如果我删除聚合部分并只是查询:

cursor = post_collection.Post.objects.all()
Run Code Online (Sandbox Code Playgroud)

在其他条件相同的情况下,以下是此新查询连续5次点击的定时结果:

0.26596999168395996 seconds
0.00011920928955078125 seconds
0.00011205673217773438 seconds
0.0001659393310546875 seconds
0.00013589859008789062 seconds
Run Code Online (Sandbox Code Playgroud)

如何解读这些结果?

我要注意的第一件事是,当使用聚合时,第一个结果并不比以下结果慢.这使我认为使用当前形式的聚合查询,不执行缓存操作.

- > 使用聚合框架时有没有办法缓存结果$lookup

第二件事是,除了在使用聚合时工作中明显的缓存机制,似乎单独的第一个查询(未缓存)的执行速度比使用聚合时快十倍.我发现很难相信在总共10 lookupAuthor文档上执行聚合超过4 个Post文档所需的速度是检索10个Post文档的速度的10倍.

所有这一切使我认为,尽管已经在查找聚合上遵循MongoDB文档,但我必须在这里做错事.