在rails中向mysql插入100000条记录的最快方法

时间:2015-10-23 07:19:52

标签: mysql ruby-on-rails ruby redis

我想将信息从redis传输到mysql。

首先,我获得了user_id和得分表格redis。

info = $redis.zrevrange("some_info", 0, limit - 1, withscores: withscores)

然后我需要处理这些日期:

  total_info = info.each_slice(2).to_a.inject([]) do |sum, e|
    sum << {
            id: id,
            name: name,
            rank: rank,
            score: score,
           }

total_info是一个大小为100000 +的数组。

然后我需要将total_info的记录插入mysql。

我尝试创建一个要插入的循环,但我认为这不是一个好主意。

如何制作?什么是最快的方式?

2 个答案:

答案 0 :(得分:4)

您可以在Active Record Import中使用Fastest Version

以下是一个例子:

columns = [ :id, :name, :rank, :score ]
values = []
infos.each do |info|
  values << [info.id, info.name, info.rank, info.score]
end
Model.import columns, values, validate: false

答案 1 :(得分:0)

感谢@ e4c5和@Rich Peck。

我将日期转储到.CSV文件中,然后将其导入mysql。它非常快!

info = $redis.zrevrange("some_info", 0, limit - 1, withscores: withscores)
CSV.open("temp.csv", "w") do |csv|
  csv << %w(id, name, rank, score......)
  info.each_slice(2) do |e|
      csv << [id, name, rank, score......]
  end
end

然后:

sql = "LOAD DATA LOCAL INFILE 'temp.csv'
       INTO TABLE <table_name>
       FIELDS TERMINATED BY ','
       ENCLOSED BY '\"'
       LINES TERMINATED BY '\n'
       IGNORE 1 ROWS
       (ia, name, rank, score.....);"
ActiveRecord::Base.connection.execute(sql)