MySQL加载数据infile真的很慢/永无止境

时间:2013-01-24 22:31:00

标签: mysql ruby-on-rails ruby

我正在处理我正在处理的应用程序的问题。 该应用程序允许用户上传由应用程序处理的CSV文件,然后将记录创建到许多表中。为了提高性能,对于其中一个表,它会生成一个新的CSV文件,以便使用mysql LOAD DATA INFILE功能。

相反,它似乎增加了处理所需的时间。 我正在使用sidekiq将所有处理推送到后台。这似乎是在没有任何问题的情况下创建CSV,但是当我执行load data查询时,它只是坐在那里而我不知道它在做什么。

我的处理功能执行以下操作:

CSV.open(output_path, 'w+', { force_quotes: true }) do |writer|
    writer << headers

    while rows.count > 0
      ....
      data_sets.each do |ds|
        writer << [UUIDTools::UUID.random_create, resp, row[set], ds.id, now, now]
        set += 1
      end
      resp += 1
    end
end

sql = "LOAD DATA LOCAL INFILE '#{output_path}'
       INTO TABLE data_set_responses
       FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
       LINES TERMINATED BY '\n'
       (id, response_number, response, data_set_id, created_at, updated_at)"

con = ActiveRecord::Base.connection
con.execute("SET autocommit = 0;")
con.execute("SET unique_checks = 0;")
con.execute("SET foreign_key_checks = 0;")
con.execute("LOCK TABLES data_set_responses WRITE;")
con.execute(sql)
con.execute("UNLOCK TABLES;")
con.execute("COMMIT;")
con.execute("SET autocommit = 1;")
con.execute("SET unique_checks = 1;")
con.execute("SET foreign_key_checks = 1;")

截至目前,我的sidekiq进程已运行22分钟,但仍未完成。它应该插入大约700k行,这些行不应该接近这么长的时间!

我插入的表有一个二进制字段,用于它的主键(uuid)所以我不知道这是否会减慢它的速度?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我最终将我的数据结构更改为不需要此结构所需的大量行的数据结构。我已经把它缩短到几秒钟了。)