SequelizeJS中的缓慢关联

我正在尝试诊断使用SequlizeJS作为ORM的快速应用程序中某些缓慢起因的原因。 我有一个模型,有2个hasMany&与另外两个模型hasOne关系:

更新 :我使用classMethods#关联函数在define调用中创build了关联。

// 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并使用asynchronous和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结果中导致重复的行,所以我们必须花费时间去重复并将其parsing到模型中。

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

当然,查询本身也可能很慢,但很可能是由于Sequelize的开销 – 尝试直接在数据库上运行查询。

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

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

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

在你的模型关联中,sequelizejs不会创build索引

将{foreignKeyConstraint:true}添加到所有关联。

 Model1.hasMany(models.Model2, {foreignKeyConstraint: true}); Model1.hasMany(models.Model3, {foreignKeyConstraint: true}); Model1.hasOne(models.Model2, {as: 'next', foreignKey: 'model2_next', foreignKeyConstraint: true}); Model2.belongsTo(models.Model1, {foreignKey: 'model2_next', foreignKeyConstraint: true});