[英]Rails best way to add huge amount of records
我必須在Rails中一次向數據庫添加25000條記錄。 我也必須驗證它們。
這就是我現在擁有的:
# controller create action
def create
emails = params[:emails][:list].split("\r\n")
@created_count = 0
@rejected_count = 0
inserts = []
emails.each do |email|
@email = Email.new(:email => email)
if @email.valid?
@created_count += 1
inserts.push "('#{email}', '#{Date.today}', '#{Date.today}')"
else
@rejected_count += 1
end
end
return if emails.empty?
sql = "INSERT INTO `emails` (`email`, `updated_at`, `created_at`) VALUES #{inserts.join(", ")}"
Email.connection.execute(sql) unless inserts.empty?
redirect_to new_email_path, :notice => "Successfuly created #{@created_count} emails, rejected #{@rejected_count}"
end
它現在非常慢,沒辦法添加這么多的記錄超時原因。
有任何想法嗎? 我正在使用mysql。
我想到三件事:
之后,您需要重新考慮這部分應用程序的流程。 如果您在像create
這樣的控制器操作中使用后台處理,則不能簡單地返回HTTP 201
或HTTP 200
。 你需要做的是返回“快速” HTTP 202 Accepted
,並提供一個鏈接到另一個表示,用戶可以檢查他們的請求的狀態(我們已經有成功響應?有多少電子郵件失敗?),因為它是現在正在后台處理。 它聽起來有點復雜,這是一個標志,你可能不應該這樣做。 為什么你必須在一個請求中添加25000條記錄? 什么是backgorund?
你為什么不為這項工作創建一個rake任務? 以下鏈接很好地解釋了它。
http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/
簡而言之,一旦你編寫了rake任務,就可以通過以下方式開始工作:
rake成員:load_emails
如果您關注速度,我會從不同的角度解決問題。
emails
表結構的表; 讓它成為emails_copy
。 不要復制索引和約束。 emails_copy
創建索引和約束以模仿emails
表。 違規行為(如有)將浮出水面; 解決它們。 insert into emails select * from emails_copy
將電子郵件放入生產表。 那么,您可以使用它來獲得正確的自動增量ID。 drop table emails_copy
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.