首页 > 解决方案 > 在 ruby​​ on rails 中有效地连接 JSON 列类型

问题描述

我的 API 响应可能返回大约 100,000 个称为 MOF 的模型的查询。每个模型都有一个名为“pregen_json”的 json 列,用于缓存模型的当前状态。这是缓存的,因为实时生成 json 太慢(~40ms/model * 100,000 个模型 = 1 Hr)。这是架构的相关位(运行 mySQL)+ 代码:

架构:

  create_table "mofs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    ...
    t.json "pregen_json"
  end

控制器:

        # some filtering of @mofs to respond to search query omitted
        render :json => @mofs.pluck(:pregen_json)

下载时间基于@mofs [m:s] 的长度

1,000 --> 0:10

10,000 --> 2:00

100,000 --> 7:00

基本上,用户看到 90% 的等待时间没有数据,然后在服务器准备好响应后立即发送所有内容。

寻找有关如何加快速度的建议。

标签: mysqlruby-on-railsjsondatabase

解决方案


通常,为了避免极长的 API 调用,人们会对结果进行分页。客户端请求特定页面(和/或特定数量的结果),服务器仅返回该页面。

有许多分页红宝石宝石,例如Will PaginateKaminari,可以帮助您做到这一点。

否则,通过使用 limit 和 offset 自己实现基本分页是相当简单的Model.limit(PAGE_SIZE).offset(PAGE_SIZE * page_number)

您可能想要添加按钮,以便客户端可以选择他想要加载的页面。如果您希望加载所有内容,那么您可以创建一个循环,不断请求下一页,直到不再返回数据。这里的优点是数据将随着时间的推移而不是在很长一段时间后一次性加载。

除此之外,我很惊讶获取 100,000 条记录需要 7 分钟。您可能只想在该预生成的 JSON 中放置必要的信息,以限制从数据库拉到客户端的数据量。

我希望这可以帮助您做出决定。祝你好运!


推荐阅读