gpt4 book ai didi

mysql - SequelizeJS 中的慢关联

转载 作者:可可西里 更新时间:2023-11-01 07:52:34 26 4
gpt4 key购买 nike

我正在尝试诊断我的 Express 应用程序运行缓慢的原因,该应用程序使用 SequlizeJS 作为 ORM。我有一个模型与其他 2 个模型具有 2x hasMany 和 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 并使用异步和 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 周期。

关于mysql - SequelizeJS 中的慢关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23014902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com