首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带缓存和不缓存的情况下,后遗症是缓慢的。

带缓存和不缓存的情况下,后遗症是缓慢的。
EN

Stack Overflow用户
提问于 2020-07-21 05:05:18
回答 1查看 1.7K关注 0票数 2

我有以下续写代码:

代码语言:javascript
复制
async function findAllRatePlans() {
    return await db.rate_plans.cache('all').findAll({
        include: [
            { model: db.pricings },
            { model: db.services },
            { model: db.usps_evs_accounts }
        ]
    });
}

这将产生以下查询(没有缓存):

代码语言:javascript
复制
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服务和belongsTo usps_evs_accounts。

这是我的第一个主要的Node和sequelize项目,我试图找出为什么代码运行这么慢。我增加了新的遗物模块,仪器设备,它似乎是后缀调用非常缓慢。最初,我直接访问了数据库,但不幸的是,我安装了sequelize-transparent-cache;,这对总体性能几乎没有影响。NewRelic显示,findAllRatePlans()函数(当使用缓存时)需要62.32ms。也许我对Node的期望是错误的,但我认为这应该更快一些。我在Ruby中有相同的代码,运行速度比Ruby快10倍。这里有什么我遗漏的东西吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-09 06:41:04

事实证明,这个SQL查询不够具体,最后返回了大约1000行,因此大约有50,000个字段。总之,这大约是2MB的数据被序列化成Javascript对象。我的问题还在于,代码总体上是非常面向对象的,有很多域对象。我认为后缀透明缓存缓存原始数据,而不是Javascript对象。最后,我编写了自己的Redis缓存,该缓存序列化了Javascript对象,提高了性能,但无法存储对象类型,因此我仍然需要执行1000次新对象。ActiveRecord和缓存机制更好地跟踪序列化和反序列化过程中的对象类型。最后,在原始SQL查询中添加更多where子句会减少记录,大大提高性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63007739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档