作業中のアプリに問題があります。このアプリを使用すると、ユーザーはCSVファイルをアップロードできます。このファイルはアプリによって処理され、レコードをいくつかのテーブルに作成します。パフォーマンスを向上させるために、テーブルの1つに対して、mysqlLOAD DATA INFILE
機能を使用するための新しいCSVファイルが生成されます。
代わりに、処理にかかる時間が長くなっているようです。を使用して、すべての処理をバックグラウンドにプッシュしています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分間実行されていますが、まだ終了していません。約70万行を挿入する必要がありますが、これほど長くかかることはありません。
挿入しているテーブルには、主キー(uuid)のバイナリフィールドがあるので、速度が低下しているかどうかわかりませんか?
何か案は?