【问题标题】:sequelize is slow with and without cachingsequelize 在有和没有缓存的情况下都很慢
【发布时间】: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


【解决方案1】:

事实证明,这个 SQL 查询不够具体,它最终返回了大约 1000 行,即大约 50,000 个字段。总之,这是大约 2MB 的数据被序列化为 Javascript 对象。我的问题还在于代码整体非常面向对象,有很多域对象。我认为 sequelize-transparent-cache 缓存原始数据而不是 Javascript 对象。我最终编写了自己的 Redis 缓存,它序列化了 Javascript 对象,并且性能得到了提升,但我无法存储对象类型,所以我仍然需要创建一个新对象 1000 次。 ActiveRecord 和缓存机制更擅长在序列化和反序列化期间跟踪对象类型。最后,在我的原始 SQL 查询中添加更多 where 子句会减少记录并大幅提升性能。

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2019-05-04
    • 2020-07-04
    • 2015-10-15
    • 2017-01-21
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多