我正在使用的应用程序有问题。该应用程序允许用户上传由应用程序处理的 CSV 文件,然后将记录创建到多个表中。为了提高性能,对于其中一个表,它会生成一个新的 CSV 文件以使用 mysqlLOAD 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)的二进制字段,所以我不知道这是否会减慢速度?
有任何想法吗?