Rails Active Model Serializers 序列化耗时特别长

cocoakekeyu · 2017年06月26日 · 最后由 jicheng1014 回复于 2017年06月29日 · 2477 次阅读

输出一个对象列表,这个对象有许多字段及关联字段要序列化为 json,关联对象都使用 eager load 获取出来了。使用 active model serializers 作为序列化器,然后发现序列化好慢,这是 rails server 的 log:

20 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (297.45ms)
Completed 200 OK in 395ms (Views: 357.6ms | ActiveRecord: 15.6ms)

10 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (176.06ms)
Completed 200 OK in 240ms (Views: 226.6ms | ActiveRecord: 8.6ms)

5 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (60.54ms)
Completed 200 OK in 100ms (Views: 89.4ms | ActiveRecord: 7.6ms)

我在代码中直接序列化并计算时间如下:

某次数据库 SQL 的加载情况:

另外发现上面的时间是本地的机器,线上用的是青云性能主机,序列化耗时会增加 100 多 ms。

得看下 sql log, 有可能关联对象还是查了一遍

active model serializers 的性能其实并不怎么样,而且一不小心就会混入额外的查询。建议看序列化时生成的日志。

对 luikore 回复

sql log? 关联对象我都一次性获取了,不再是按需取,全都是 select * from table in [id]。

对 zlx_star 回复

它的写法很方便呢,想换一个对比一下。序列化时有产生的日志吗?

从你的 log 看感觉每个对象都有产生新查询... 我以前用这玩意的时候,也经常自信的觉得 eager load 了,但结果还是会产生 sql 查询,得一步一步的断着找...

对 luikore 回复

这些查询都是必须的,因为 topic 关联了七八个对象

精简 serializer 去掉一些不用的字段,把时间控制在 170ms 左右了。

哥哥,配个 newrelic 看看你这个访问 调用了多少次数据库就知道了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号