我正在尝试诊断我的Express应用程序中使用SequlizeJS作为ORM的一些减速原因.我的模型有2x hasMany&与其他2个模型的hasOne关系:
更新:我使用classMethods #association函数在define调用中建立了关联.
// 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& amp;手动合并它们. 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结果中出现重复行,因此我们不得不花时间对其进行重复数据删除并将其解析为模型.
为了获得最佳性能,您可以在您的include中保留:1个关系,但在单独的查询中执行:M.
当然查询本身也可能很慢,但很可能是Sequelize开销的结果 – 尝试直接在数据库上运行查询.
(免责声明:Sequelize核心开发人员)
你在运行什么版本?您报告的初始数字听起来很高,但在我们进行一些优化之前,我们已经听说过这些数字,请尝试针对最新的git master进行测试.
我们一直在努力优化这些场景的代码,但重复数据删除20.000行到5.000行总是需要一些cpu周期.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。