【发布时间】:2020-11-10 10:24:37
【问题描述】:
我有以下续集代码:
async function findAllRatePlans() {
return await db.rate_plans.cache('all').findAll({
include: [
{ model: db.pricings },
{ model: db.services },
{ model: db.usps_evs_accounts }
]
});
}
这会产生以下查询(没有缓存):
SELECT
"rate_plans"."id",
"rate_plans"."tag",
"rate_plans"."service_id" AS "serviceId",
...
"pricing"."id" AS "pricing.id",
"pricing"."name" AS "pricing.name",
"pricing"."api_name" AS "pricing.apiName",
...
"usps_evs_account"."id" AS "usps_evs_account.id",
"usps_evs_account"."default" AS "usps_evs_account.default",
...
FROM "rate_plans" AS "rate_plans"
LEFT OUTER JOIN "pricings" AS "pricing" ON "rate_plans"."pricing_id" = "pricing"."id"
LEFT OUTER JOIN "services" AS "service" ON "rate_plans"."service_id" = "service"."id"
LEFT OUTER JOIN "usps_evs_accounts" AS "usps_evs_account" ON "rate_plans"."nsa_usps_evs_account_id" = "usps_evs_account"."id"
大约有 50 列是 select 语句的一部分。
rate_plan 定义为belongsTo 定价、belongsTo services 和belongsTo usps_evs_accounts。
这是我的第一个主要 Node 和 sequelize 项目,我正在尝试找出代码运行如此缓慢的原因。我添加了 newrelic 模块来检测事物,看起来 sequelize 调用非常慢。最初我直接访问数据库,但后来我安装了 sequelize-transparent-cache;不幸的是,这对整体性能影响不大。 NewRelic 显示findAllRatePlans() 函数(使用缓存时)需要 62.32 毫秒。也许我对 Node 的期望是错误的,但我认为这应该快得多。我在 Ruby 中有相同的代码,它的运行速度快了 10 倍。我在这里有什么遗漏吗?
【问题讨论】:
-
你在 Rails 中做了什么?使用 ActiveRecord 吗? sequelize 是 DAO 之上的 ORM 层,它解析和去重结果,您可以尝试使用“raw:true”标志运行您的查询,或者您可以尝试使用 sequelize.query() 运行原始查询,或者如果您的嵌套包含中有 1:m 关系,则使用“seperate:true”。
-
是的,ActiveRecord,但我确实启用了一些缓存解决方案。慢慢地,我开始认为它可能不是续集。我编写了自己的缓存,不同的环境产生不同的性能数字。在我回复我的研究之前,我会做更多的挖掘工作
标签: node.js sequelize.js