1

我正在处理相当大量的数据,我希望有一些建议可以加快记录创建速度。在我的测试中,我创建了大约 300k 行和大约 9 列,它花费的时间比我希望的要长得多。

我基本上为每个用户都有一个对象列表,我使用其中的数据来生成更长的不同列表。

我的控制器中的基本结构如下:

def create
  @list = Thing.all.to_array
  @list.each do |item|
    @new_thing   = NewThing.new
    @new_thing.a = item.a
    @new_thing.b = item.b 
    @new_thing.save
  end
end        

我能做些什么来加快速度?

4

2 回答 2

3

有几种方法可以实现这一点。

  1. 将所有内容包装在事务中:ActiveRecord::Base.transaction
  2. 编写原始 SQL:NewThing.connection.execute "INSERT INTO new_things (a, b) values (a, b)"
  3. 编写批量插入:


def create
  @inserts = []
  @list = Thing.all.to_a
  @list.each do |item|
    @inserts.push "(#{item.a}, #{item.b})"
  end
  sql = "INSERT INTO new_things (`a`, `b`) VALUES #{@inserts.join(", ")}"
  NewThing.execute(sql)
end

批量插入运行速度最快,但最难编写和理解。权衡取舍。

此外,由于您已将其置于创建操作中,因此最好将其移动到后台作业中,这样您的大型数据库操作就不会阻碍用户。

于 2013-10-22T14:55:15.653 回答
3

如果您想减少时间,我建议您使用直接查询。

def create
  NewThing.execute("INSERT INTO new_things (a,b) SELECT a, b FROM things")
end

上面的 sql 语句适用于 mysql。

于 2013-10-22T14:52:05.660 回答