0
我遇到了一个我正在处理的应用程序的问题。 该应用程序允许用户上传由应用程序处理的CSV文件,然后将记录创建为多个表格。为了提高性能,对于其中一个表,它会生成一个新的CSV文件,以便使用mysql LOAD DATA INFILE
功能。MySQL加载数据真的很慢/永不结束
相反,它似乎在增加处理时间。 我使用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),所以我不知道是否会减慢它的速度?
任何想法?
一个快速评论。我不确定他们是否修正了这个问题,但我知道我们的dbas曾指出,根据规范,UUIDTools创建的UUID不是真正的uuid。无论如何,您应该使用Ruby的SecureRandom.uuid http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html,因为我认为它更高性能。 – engineerDave
啊,够公平的。我会改变这一点。尽管我正在使用的gem仍然使用UUIDTools版本:( – PaReeOhNos
)为什么要通过创建Rails对象直接通过Rails将CSV文件写入数据库? –