2013-01-24 44 views
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),所以我不知道是否會減慢它的速度?

任何想法?

+0

一個快速評論。我不確定他們是否修正了這個問題,但我知道我們的dbas曾指出,根據規範,UUIDTools創建的UUID不是真正的uuid。無論如何,您應該使用Ruby的SecureRandom.uuid http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html,因爲我認爲它更高性能。 – engineerDave

+0

啊,夠公平的。我會改變這一點。儘管我正在使用的gem仍然使用UUIDTools版本:( – PaReeOhNos

+0

)爲什麼要通過創建Rails對象直接通過Rails將CSV文件寫入數據庫? –

回答

1

我最終將我的數據結構更改爲不需要此結構所需的大量行的數據結構。我已經把它歸結爲幾秒鐘的事情:)