2010-06-22 116 views
3

所以我試圖導入一些銷售數據到我的MySQL數據庫。這些數據最初是以原始CSV文件的形式存在的,我的PHP應用程序需要先處理這些數據,然後將處理後的銷售數據保存到數據庫中。導入批量數據到MySQL

最初我在做個別的INSERT查詢,我意識到這是非常低效的(約6000個查詢幾乎要花費2分鐘)。然後我生成了一個大的查詢,並一次性編輯了所有的數據。這給我們提高了3400%的效率,並將查詢時間減少到剛好超過3秒

但據我所知,LOAD DATA INFILE應該比任何種類的INSERT查詢更快。所以現在我正在考慮將處理後的數據寫入文本文件並使用LOAD DATA INFILE將其導入數據庫。這是將大量數據插入數據庫的最佳方式嗎?或者我是否完全用錯誤的方式來解決這個問題?

我知道數以千計的大部分數字數據在事物的宏觀方案中並不是很多,但我試圖讓這個Intranet應用程序儘可能快速/快速響應。而且我還想確保在我們決定將該計劃授權給其他公司的情況下,此流程可以擴大規模。

UPDATE:

所以我沒有繼續前進,測試LOAD DATA INFILE出的建議,認爲它會給我只邊際速度增加(因爲我現在正在寫相同數據到磁盤的兩倍),但我是當它將查詢時間從3300ms降低到〜240ms時感到驚訝。該頁面仍然需要大約1500毫秒才能執行總計,但仍然比以前明顯更好。

從這裏我猜我會檢查數據庫中是否有多餘的索引,並且由於除了兩個表格都是InnoDB,我會研究優化InnoDB緩衝池以優化整體性能。

+1

我知道這個問題是在幾年前發佈的,但我不得不說,一個批量INSERT和LOAD DATA INFILE之間的區別是節省時間。我使用INSERT從30秒/秒增加到10秒,使用30列CSV文件加載~11000行。 – 2013-11-19 15:56:10

回答

4

LOAD DATA INFILE速度非常快,並且是將文本文件導入MySQL的正確方法。它是用於數據-up的插入加快20倍的速度推薦的方法之一,根據該:

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

假設寫入處理的數據返回到文本文件是不是插入它快進入數據庫,那麼這是一個好方法。

1

你的方法應該沒問題。我不確定LOAD DATA INFILE與批量INSERT相比有多快,但我聽說過相同的事情,它應該會更快。

當然,你會想要做一些基準測試,但我認爲這是值得寫一些測試代碼。

3

LOAD DATA或多個插入將比單插入好得多; LOAD DATA可以爲你節省一點點你可能不太在意的事情。

在任何情況下,在一個事務中執行很多但不會太多 - 每個事務通常有10,000行感覺正確(注意:這與非事務性引擎無關)。如果您的交易太小,它將花費所有時間將日誌同步到光盤。

大部分時間做一個大插入將來自建立索引,這是一個昂貴的和內存密集型操作。

如果您需要的性能,

  • 有儘可能
  • 確認表及其所有索引適合你的InnoDB緩衝池(這裏假設InnoDB的)
  • 只需添加更多的內存爲幾個指標直到你的桌子適合內存,除非這變得過於昂貴(現在的64G不是太貴)

如果你必須使用MyISAM,那裏有幾個骯髒的竅門這更好,我不會進一步討論。

2

夥計們,我有同樣的問題,我的需求可能比一般更具體一點,但我寫了一篇關於我的發現的文章。

http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

我需要加載的數據是快,但需要保存到一個平面文件上飛意味着平均負載倍批量插入所花的時間。此外,我並不需要做超過200次的查詢,在此之前,我一次只做一次,現在我正在使用它,時間節省在幾秒鐘之內。

無論如何,希望這會幫助你?

+0

有趣。這對於許多用例來說絕對是好事,儘管我對你如何得到0.0013sec的數字有點困惑。 (我不擅長統計。) – 2011-03-10 04:30:55

+1

Lese:這是關於標準偏差的。我對標準差的理解是它顯示了平均值有多少差異。 (Excel爲我做了計算)。我的觀點是體積的標準偏差小於載荷數據的標準偏差。對我而言,這意味着BULK的速度最快。在決定這一點時,哪一個對我來說是最重要的因素。主要是因爲這是在一個現場。 希望這有道理?查看更多信息:http://en.wikipedia.org/wiki/Standard_deviation – Andy 2011-03-11 10:29:22