SequelizeJS 中的慢关联

本教程将介绍SequelizeJS 中的慢关联的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

SequelizeJS 中的慢关联 教程 第1张

问题描述

我正在尝试诊断使用 SequlizeJS 作为 ORM 的 Express 应用程序出现某些速度下降的原因.我有一个模型有 2x hasMany &与其他 2 个模型的 hasOne 关系:

更新:我已经使用 classMethods#associate 函数在定义调用中建立了关联.

// Model1
classMethods: {
 associate: function(models) {
  Model1.hasMany(models.Model2);
  Model1.hasMany(models.Model3);
  Model1.hasOne(models.Model2, {as: 'next', foreignKey: 'model2_next'});
 }
}

// Model2
classMethods: {
 associate: function(models) {
  Model2.belongsTo(models.Model1, {foreignKey: 'model2_next'});
 }
}

如果我通过以下方式查询它们:

db.Model1.find({
 where: { /* Simple where statement */ },
 include: [
  db.Model2,
  db.Model3,
  { model: db.Model2, as: 'next' },
 ]
}).complete(function(err, data) {
 res.json(data);
});

响应可能需要 8-12 秒.但是,如果我单独查询 Model2 并使用 async & 手动合并它们lodash 库:

async.parallel({
 model2: function(callback) {
  db.Model2.findAll({
where: { /* Simple where statement */ }
  }).complete(callback)
 },
 model1: function(callback) {
  db.Model1.find({
where: { /* Simple where statement */ },
include: [
 db.Model3,
 { model: db.Model2, as: 'next' },
]
  }).complete(callback);
 }
}, function(err, data) {
 var response = data.model1.values;
 response.Model2 = data.model2.map(function(Model2){ return Model2.values });

 res.json(response);
})

需要 60-100 毫秒.

我已经尝试从 MySQL 切换到 PostgreSQL,虽然 PostgreSQL 稍微快了一点,但只有 2-3%!

是什么导致 Sequelize 花费的时间比拆分查询要长得多,有什么方法可以加快速度吗?

推荐答案

将 :M 关系添加到包含时,Sequelize 会变慢.:M 关系会导致您的 sql 结果中出现重复的行,因此我们必须花时间对其进行重复数据删除并将其解析为模型.

为了获得最佳性能,您可以将 :1 关系保留在包含中,但在单独的查询中执行 :M.

当然查询本身也可能很慢,但很可能是 Sequelize 开销的结果 - 尝试直接在数据库上运行查询.

(免责声明:Sequelize 核心开发者)

你运行的是什么版本?您报告的初始数字听起来很高,但我们在进行一些优化之前已经听说过这些数字,请尝试针对最新的 git master 进行测试.

我们一直致力于针对这些场景优化代码,但是将 20.000 行重复数据删除到 5.000 行将始终需要一些 cpu 周期.

好了关于SequelizeJS 中的慢关联的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。