2011-09-28 18 views
5

我想上傳一個大的csv文件,在mysql表中大約有10,000,000條記錄,它們也包含相同或更多的no。的記錄和一些重複的記錄。 我嘗試了本地數據infile,但它也需要更多時間。 如何解決這個問題,而不需要等很長時間。 如果它不能解決,那麼我怎樣才能用AJAX來發送一些記錄並一次處理它,直到整個csv被上傳/處理。上傳大大的CSV文件在mysql表中大約10,000,000條記錄也包含重複行

+2

您必須首先解釋您提出的這個新的數字符號。 – mowwwalker

+0

是十億記錄還是一千萬?通過ajax的 – webbiedave

+2

會更慢。如果您希望load infile命令不需要很長時間,請將csv分解爲更小的塊。 –

回答

0

試試這個:

load data local infile '/yourcsvfile.csv' into table yourtable fields terminated by ',' lines terminated by '\r\n' 
+0

OP表示他已經嘗試過'load infile',並且速度太慢。這是怎麼改變的? –

+0

我已經試過這個.. – akashdeep

+0

ups,對不起!沒有閱讀的問題:/ – hunt

6

LOAD DATA INFILE是不會被打敗的速度明智的。有幾件事你可以加快它:

  • 刪除或禁用一些索引(但當然,你會得到等待它們加載後,但這通常更快)。如果你使用的是MyISAM,你可以使用ALTER TABLE *foo* DISABLE KEYS,但不幸的是InnoDB不支持。你將不得不放棄他們。
  • 優化您的my.cnf設置。特別是,你可能會禁用很多安全的東西(如fsync)。當然,如果你發生崩潰,你將不得不恢復備份並重新開始加載。另外,如果你正在運行默認的my.cnf,最後我檢查了它對數據庫機器來說是非常不理想的。大量的調音指南都在附近。
  • 購買更快的硬件。或者租一些(例如,嘗試一個快速的Amazon ECC實例)。
  • 作爲@ZendDevel提到,考慮其他數據存儲解決方案,如果你沒有被鎖定到MySQL。例如,如果你只是存儲一個電話號碼列表(以及一些數據),一個簡單的哈希表將會快很多倍。

如果問題是,它殺死一個數據庫的性能,可以拆分成CSV文件多個CSV文件,並在塊加載它們。

+0

其實我正在處理呼叫中心的手機號碼白名單解決方案,我必須每天上傳這些數據(重複的行數)。 – akashdeep

+0

@ user969923:聽起來就像是你要結合優化my.cnf,如果還沒有完成併購買更快的硬件。 Serverfault的人可能可以幫助你更多的具體細節。 – derobert

+0

如何處理哈希表。我只有5個字段,只有一個是主鍵(手機號碼)。給我舉個例子。 – akashdeep

0

根據您的存儲引擎,這可能需要很長時間。我注意到,用MYISAM它會快一點。我剛剛用完全相同的數據集進行了測試,最後我使用了PostgreSQL,因爲它在加載文件時更加穩健。 Innodb太慢了,我在兩個小時後用同樣大小的數據集中止了它,但它是128列滿數據的10,000,000條記錄。

0

由於這是一個每天更新的白名單,這並不意味着有大量的重複(第一天之後)?如果是這種情況,它會使上傳速度快得多,做一個簡單的腳本,在插入它之前檢查記錄是否已經存在。

0

嘗試此查詢:

$sql="LOAD DATA LOCAL INFILE '../upload/csvfile.csv' 
INTO TABLE table_name FIELDS 
TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' "