Rails ActiveRecord 单表导出时避免对象实例化可使速度增加 10 倍

swordray · 2014年03月21日 · 最后由 datty258 回复于 2014年04月09日 · 2379 次阅读

直接贴代码比较清楚。这种方法既可以利用 ActiveRecord(Ruby)的开发效率,又可以达到很高的性能。

records = ActiveRecordClass.select(...).where(...).order(...).paginate(...)

# before
records.to_json

# after - with 1000% performance improvement
records.klass.connection.execute(records.to_sql).to_a.map { |record| [records.select_values, record].transpose.to_h } }.to_json

直接用 SQL 吧?

果然直接写 sql 语句的速度最快

3楼 已删除

把数据列直接写到 json 中去,避免构建对象再序列化为 json。

Postgre 可以直接…… select row_to_json(ROW(id, name, ...)) from users

不过不知道速度能有多少差别……

硬件便宜,程序员贵。要都这么写成本就很高了。

#1 楼 @ruby_sky #2 楼 @ywjno #5 楼 @Kabie

直接写 SQL 就利用不上 ActiveRecord 的查询功能了

记得 ActiveSuppoer .to_json 有加一些料,这样跑出来的 json 可能跟原本有些不同。

#6 楼 @billy 这是我们优众网开发中遇到的真实问题,有些合作伙伴需要一次请求导出大量数据

@swordray 明白,肯定是有用的,只是不是通用场景。另发现 ruby-china 头像更新 bug 一只。

#10 楼 @billy 几乎每个网站后台都有导出数据的功能,个人感觉还算是通用场景

不错,可以尝试一下

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