我有一个超过500k条记录的表,目前我正在以这种方式获取数据:
Account.find_each(:conditions =>{:status =>STATUS[:waiting]}) do |user|
unless user.games.include? game
begin
user.account_games.create!(:game_id => game.id,:status => STATUS[:waiting])
user.activate
rescue Exception => e
$LOG.error "Error : #{e.to_s}"
end
end
end
现在我不确定我在这里做错了什么,但有一点是肯定的,这很慢,我不知道是find_each还是其他什么,但如果你能给我任何提示,让它更快,我将不胜感激。
提前感谢
发生了两件事:
首先是选择查询-
@account = Account.where(:status =>STATUS[:waiting])
第二个是在每个上创建
@account.each do |user|
unless user.games.include? game
begin
user.account_games.create!(:game_id => game.id,:status => STATUS[:waiting])
user.activate
rescue Exception => e
$LOG.error "Error : #{e.to_s}"
end
end
end
更新:
有一个著名的Rails性能提示:Anand
的查询优化。
还要检查QueryReviewer gem。
除此之外,还有许多因素可以加快性能,比如处于后活动记录查询接口优化中。
在模型中使用find_by_sql子句。
我想到了两个选项:
1) 在活动记录中全选,然后使用ruby进行迭代,将需要大量内存。
2) 用sql编写查询,并将其放入存储过程中,然后调用该过程。