猫鼬填充选项和查询时间
Mongoose populate option and query time
我在一个平台上工作,我在所有查询中使用 mongoose .populate 次数,我打开 mongoose 调试模式,发现查询执行时间几乎没有差异(现在 100 个文档,有将来会有 100000 个文档)使用填充和不使用填充。
我知道 populate 基本上也在内部进行 finOne 查询,我的问题是,使用 .populate
是否会增加我的查询时间,或者如果记录数达到数百万,它是否会影响我的性能。还有我可以选择提高性能的替代方法
总的来说,您是对的 - 您希望避免使用 populate(),因为它会为每一行发出另一个查询。请记住,这是对服务器的完整 round-trip。 Mongo 没有任何类型的连接概念,因此当您填充时,您会为返回集中的每一行发出额外的查询。
解决此问题的方法是对数据进行非规范化 - 不要像关系数据库那样设计 mongo 数据库。 mongo 文档有很多关于如何执行此操作的信息。 https://docs.mongodb.org/manual/core/data-model-design/ 在设计 Mongo 时要牢记的一件重要事情是,您永远不想拥有无限增长的子文档。由于 mongo space 分配和分页的工作方式,这可能会导致严重的性能问题,因此如果您遇到这种情况,最好进行规范化。
另一种非常常见的技术是子文档缓存。这是您从 "joined" collection 获取部分数据并将其缓存到您正在查询的 collection 的地方。在这种情况下,您正在用 space 换取性能,因为您有重复数据。此外,您必须确保在数据发生变化时及时更新数据。有了mongoose,在国外collection.
的模型上做一个post-save钩子就很容易了
我在一个平台上工作,我在所有查询中使用 mongoose .populate 次数,我打开 mongoose 调试模式,发现查询执行时间几乎没有差异(现在 100 个文档,有将来会有 100000 个文档)使用填充和不使用填充。
我知道 populate 基本上也在内部进行 finOne 查询,我的问题是,使用 .populate
是否会增加我的查询时间,或者如果记录数达到数百万,它是否会影响我的性能。还有我可以选择提高性能的替代方法
总的来说,您是对的 - 您希望避免使用 populate(),因为它会为每一行发出另一个查询。请记住,这是对服务器的完整 round-trip。 Mongo 没有任何类型的连接概念,因此当您填充时,您会为返回集中的每一行发出额外的查询。
解决此问题的方法是对数据进行非规范化 - 不要像关系数据库那样设计 mongo 数据库。 mongo 文档有很多关于如何执行此操作的信息。 https://docs.mongodb.org/manual/core/data-model-design/ 在设计 Mongo 时要牢记的一件重要事情是,您永远不想拥有无限增长的子文档。由于 mongo space 分配和分页的工作方式,这可能会导致严重的性能问题,因此如果您遇到这种情况,最好进行规范化。
另一种非常常见的技术是子文档缓存。这是您从 "joined" collection 获取部分数据并将其缓存到您正在查询的 collection 的地方。在这种情况下,您正在用 space 换取性能,因为您有重复数据。此外,您必须确保在数据发生变化时及时更新数据。有了mongoose,在国外collection.
的模型上做一个post-save钩子就很容易了