Ruby on rails RubyonRails Postgres/Active Record搜索优化
所以可能没有办法解决这个问题,但我想我会问: 我已经设置了Postgresql数据库。第一个表包含重播,每个重播有10个不同的玩家,并且有很多关系。我想根据我的搜索结果呈现一个JSON,其中包含与玩家的回放。然而,我正在播放大量的2000年重播,它们都有10名玩家,这意味着要搜索20000名玩家 这是索引搜索当前的外观:Ruby on rails RubyonRails Postgres/Active Record搜索优化,ruby-on-rails,json,ruby,postgresql,Ruby On Rails,Json,Ruby,Postgresql,所以可能没有办法解决这个问题,但我想我会问: 我已经设置了Postgresql数据库。第一个表包含重播,每个重播有10个不同的玩家,并且有很多关系。我想根据我的搜索结果呈现一个JSON,其中包含与玩家的回放。然而,我正在播放大量的2000年重播,它们都有10名玩家,这意味着要搜索20000名玩家 这是索引搜索当前的外观: def index @replays = Replay.where(map_id: params['map_id'].to_i) @replays = @replays
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个玩家,甚至一个特定的玩家重播只需几秒钟。第一次搜索本身也只需几秒钟,所以我认为这是一个容量问题 尝试加载重播
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
试着加载你的重播
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
您可以发布生成的实际sql查询吗?第一次搜索:选择玩家。*从玩家所在的位置。replay\u id=$1,然后在搜索玩家时:选择玩家。*从玩家所在的位置。replay\u id=$1[[replay\u id,117217]]每次重播可以发布生成的实际sql查询吗?第一次搜索:选择玩家。*从玩家所在的位置。重播id=$1,然后在搜索玩家时:选择玩家。*从玩家所在的位置。重播id=$1[[replay\u id,117217]]每次重播有效,时间大幅缩短。在254032ms的视图中完成了200次OK:34.1ms |活动记录:20682.4ms完成了提示-回答不错。我要补充的是,至少应该将该请求的一些元素放到模型范围中,以便稍微清理一下控制器@GustavMauler-供将来参考,这是一个N+1问题,会让你慢下来。这个查询看起来还是相当大的。如果您愿意,请用新的瓶颈打开另一个问题。谢谢@srack是的,我现在明白了。也许这很贪婪,但有可能获得更好的性能吗?是的,我很确定。但是,我们需要更多的信息,正如在这个问题上。打开另一张他的作品,时间大大缩短了。在254032ms的视图中完成了200次OK:34.1ms |活动记录:20682.4ms完成了提示-回答不错。我要补充的是,至少应该将该请求的一些元素放到模型范围中,以便稍微清理一下控制器@GustavMauler-供将来参考,这是一个N+1问题,会让你慢下来。这个查询看起来还是相当大的。如果您愿意,请用新的瓶颈打开另一个问题。谢谢@srack是的,我现在明白了。也许这很贪婪,但有可能获得更好的性能吗?是的,我很确定。但是,我们需要更多的信息,正如在这个问题上。打开另一个