Ruby on Rails Postgres / Active Record Search Optimization

时间:2017-11-24 14:50:20

标签: ruby-on-rails json ruby postgresql

所以可能没有办法解决这个问题,但我想我会问:

我设置了Postgresql数据库。第一个表包含重放,每个重播有10个独特的玩家(有很多关系)。我想根据我的搜索呈现一个JSON,其中包含与玩家的重放。然而,我正在进行大量的重播(2000年) - 这些重播都有10名玩家,这意味着要搜索20,000名玩家。

这是索引搜索目前的样子:

def index
  @replays = Replay.where(map_id: params['map_id'].to_i)
  @replays = @replays.reverse
  render json: @replays[0..2000].to_json(include: [:players])
end

搜索需要很长时间:

Completed 200 OK in 639596ms (Views: 42.1ms | ActiveRecord: 329252.3ms)

有没有更好的方法可以搜索和呈现不会花费这么久的JSON?值得注意的是,只需要搜索2k重放,20k播放器,甚至是玩家的单个特定重播只需要几秒钟(第一次搜索本身也只需要几秒钟),所以我认为这样做了。卷量问题。

1 个答案:

答案 0 :(得分:2)

尝试加载重播

replays = Replay.last_two_thousands_by_map_id(params[:map_id])

render json: replays.to_json(include: [:players])

# replay.rb model
def self.last_two_thousands_by_map_id(map_id)
  includes(:players).where(map_id: map_id).order(id: :desc).limit(2000)
end