我有以下续写代码:
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服务和belongsTo usps_evs_accounts。
这是我的第一个主要的Node和sequelize项目,我试图找出为什么代码运行这么慢。我增加了新的遗物模块,仪器设备,它似乎是后缀调用非常缓慢。最初,我直接访问了数据库,但不幸的是,我安装了sequelize-transparent-cache;,这对总体性能几乎没有影响。NewRelic显示,findAllRatePlans()函数(当使用缓存时)需要62.32ms。也许我对Node的期望是错误的,但我认为这应该更快一些。我在Ruby中有相同的代码,运行速度比Ruby快10倍。这里有什么我遗漏的东西吗?
发布于 2020-08-09 06:41:04
事实证明,这个SQL查询不够具体,最后返回了大约1000行,因此大约有50,000个字段。总之,这大约是2MB的数据被序列化成Javascript对象。我的问题还在于,代码总体上是非常面向对象的,有很多域对象。我认为后缀透明缓存缓存原始数据,而不是Javascript对象。最后,我编写了自己的Redis缓存,该缓存序列化了Javascript对象,提高了性能,但无法存储对象类型,因此我仍然需要执行1000次新对象。ActiveRecord和缓存机制更好地跟踪序列化和反序列化过程中的对象类型。最后,在原始SQL查询中添加更多where子句会减少记录,大大提高性能。
https://stackoverflow.com/questions/63007739
复制相似问题