mysql - 在 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% 的等待时间没有数据,然后在服务器准备好响应后立即发送所有内容。
寻找有关如何加快速度的建议。
解决方案
通常,为了避免极长的 API 调用,人们会对结果进行分页。客户端请求特定页面(和/或特定数量的结果),服务器仅返回该页面。
有许多分页红宝石宝石,例如Will Paginate或Kaminari,可以帮助您做到这一点。
否则,通过使用 limit 和 offset 自己实现基本分页是相当简单的Model.limit(PAGE_SIZE).offset(PAGE_SIZE * page_number)
。
您可能想要添加按钮,以便客户端可以选择他想要加载的页面。如果您希望加载所有内容,那么您可以创建一个循环,不断请求下一页,直到不再返回数据。这里的优点是数据将随着时间的推移而不是在很长一段时间后一次性加载。
除此之外,我很惊讶获取 100,000 条记录需要 7 分钟。您可能只想在该预生成的 JSON 中放置必要的信息,以限制从数据库拉到客户端的数据量。
我希望这可以帮助您做出决定。祝你好运!
推荐阅读
- javascript - VSCode 查找双重包装的 es6 模块的引用
- amazon-web-services - AWS Batch 作业在计算环境中启动时间过长且 Min vCPUs=0
- javascript - 将嵌套数组与Javascript中的唯一元素合并
- django - Django:应用 filter() 函数给出 NameError
- c# - 由于可空类型更改为枚举,迁移后 EF 核心更新失败
- dependencies - sr-feuser-register 有或没有弃用 rsaauth
- c# - 行为异步等待控制台应用程序与 WPF
- java - 针对 json 模式的 Json 验证失败
- javascript - 在我发送回调函数上的数据之前,我如何才能等到整个批次的请求都被提出并解决了承诺?
- excel - 根据星期几自动运行宏