Mysql 在RubyonRails中高效地连接JSON列类型

Mysql 在RubyonRails中高效地连接JSON列类型,mysql,ruby-on-rails,json,database,Mysql,Ruby On Rails,Json,Database,我的API响应的查询可能会返回大约100000个名为MOF的模型。每个模型都有一个名为“pregen_json”的json列,用于缓存模型的当前状态。这是缓存的,因为实时生成json太慢(~40ms/model*100000 models=1小时)。以下是模式(运行mySQL)+代码的相关部分: 模式: create_table "mofs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|

我的API响应的查询可能会返回大约100000个名为MOF的模型。每个模型都有一个名为“pregen_json”的json列,用于缓存模型的当前状态。这是缓存的,因为实时生成json太慢(~40ms/model*100000 models=1小时)。以下是模式(运行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]

1000-->0:10

10000-->2:00

100000-->7:00

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


寻找如何加速的建议。

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

有许多分页ruby gems,比如or,可以帮助您实现这一点

否则,使用limit和offset
Model.limit(PAGE\u SIZE)、offset(PAGE\u SIZE*PAGE\u number)实现基本分页就相当简单了

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

除此之外,我感到惊讶的是,获得100000张唱片需要7分钟。您可能只想在预先生成的JSON中添加必要的信息,以限制从数据库拉到客户机的数据量

我希望这有助于你做出决定。祝你好运