【问题标题】:Sequelize high memory usage with n:m assosiations使用 n:m 关联处理高内存使用情况
【发布时间】:2021-07-19 06:48:41
【问题描述】:

我的设置是 sequelize.js 与 node.js 和 express.js。我有一个名为“房间”的模型。这个模型有一些 n:m 关联。由于我根据关联数据过滤了我的数据,因此每次获取所有房间时,我都必须包含所有关联。

Room.findAll({
    where: whereCondition,
    include: ['purposes', 'prices', 'furnishing', 'technic', 'floor']
}).then(data => {
  res.send(data);
});

如何设置关联的示例:

// room <-> technic m:n
db.room.belongsToMany(db.technic, {
  as: "technic",
  through: "room_technic",
  foreignKey: "roomId",
  otherKey: "technicId"
});
db.technic.belongsToMany(db.room, {
  as: "rooms",
  through: "room_technic",
  foreignKey: "technicId",
  otherKey: "roomId"
});

这会导致一个大查询。我找到了一个很老的答案,关于一个大查询的内存问题:https://stackoverflow.com/a/23081751/2834550 建议是将查询拆分为多个。

所以,我在理论上问如何拆分它?

这仍然是克服内存性能不佳的最佳方法吗?

谢谢, 卢克

【问题讨论】:

  • 我猜你说的是cpu周期?还有往返时间?这对记忆有什么影响。你有几个房间?
  • @iwaduarte 这个应用程序托管在 heroku 上,指标告诉我,它超过了 512MB 内存限制。我只有大约 90 个房间,但是运行这个查询会得到一个包含 19200 个条目的结果。
  • 问题是。 1)你需要这些包括的所有属性吗? 2)你需要它们吗? 3)在我看来,其他东西可能会影响性能你在heroku环境中的设置是什么?您使用的是哪个数据库?获取查询需要多长时间?
  • @iwaduarte 感谢您的回复。那么问题是,我需要所有属性进行过滤。为了向用户显示房间,起初不需要它们。因此,我将查询拆分为小的查询,每个查询都返回过滤后的房间,然后我返回所有具有这些 ID 的房间。不知道这是否“好”,但性能明显更好!我想我可以忍受它。
  • @iwaduarte 3) 你们到底是怎么设置的?我正在使用 postgresql 数据库。

标签: node.js express sequelize.js out-of-memory


【解决方案1】:

一种方法是使用分页/限制: Doc link

一个好的做法是在您的 REST API 资源上使用默认分页,以及 LIMIT 和 SKIP 的可选查询字符串参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2012-02-01
    相关资源
    最近更新 更多