【问题标题】:large field in mongodb document is slowing down aggregate querymongodb 文档中的大字段正在减慢聚合查询
【发布时间】:2019-08-13 13:11:34
【问题描述】:

我有一个名为“问题”的集合,其中包含大约 15 个字段。有一个名为“用户”的索引字段。另一个字段是“response_api”,它是一个大约 60KB 的子文档。这个集合中大约有 40000 个文档。

当我在用户字段上仅使用 $match 阶段运行聚合查询时,它非常慢,大约需要 11 秒才能完成。 查询是:

db.questions.aggregate([{$match: {user: ObjectId("5c9a19abc89b2d09740ccd1d")} }])

但是,当我使用 $project 阶段运行相同的查询时,它会在不到 10 毫秒内快速返回。查询是:

db.questions.aggregate([{$match: {user: ObjectId("5c9a19abc89b2d09740ccd1d")} }, {$project: {_id: 1, user: 1, subject: 1}}])

注意:这个特定用户在问题集合中有 5000 个文档。

当我复制这个没有“response_api”字段的集合并在用户字段上创建索引时,复制的集合上的这两个查询都非常快,并且花费了不到 10 毫秒。

有人能解释一下这里发生了什么吗?是因为那个大领域吗?

【问题讨论】:

  • 有意义的是,包含大字段的查询会比没有它的查询慢得多,对吧?
  • @JohnnyHK 是的,这正是正在发生的事情。但是...我最近注意到一个奇怪的行为,如果我运行“查找”查询而不是聚合,无论有没有大字段,它都会运行得非常快。这种行为让这个问题更加奇怪

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

根据 MongoDB 提供的this 文档,您应该检查索引的大小。基本上,如果索引大小超过您的 RAM 可以容纳的大小,那么 MongoDB 将从磁盘读取它们,因此您的查询会慢很多。

【讨论】:

  • 索引大小在这两种情况下都很常见,那为什么第一种情况下查询很慢呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2020-08-02
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多