【问题标题】:Fastest way to insert 100000+ records to mysql in rails在rails中将100000+条记录插入mysql的最快方法
【发布时间】:2016-01-22 15:55:44
【问题描述】:

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

一开始我得到了redis的user_id和score表单。

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。

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

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

【问题讨论】:

  • 最快的方法是迭代redis集合,将每一行写入一个CSV文件并用LOAD DATA INFILE加载
  • @e4c5 好主意!我正在尝试
  • 是的,最好的方法是将数据转储到.sql 文件中,然后将其放入数据库中。 CSV 就足够了;遍历一个循环将花费 FOREVER

标签: mysql ruby-on-rails ruby redis


【解决方案1】:

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

这是一个例子:

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

【讨论】:

    【解决方案2】:

    感谢@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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2012-10-19
      • 1970-01-01
      • 2020-08-10
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2013-11-29
      相关资源
      最近更新 更多