2012-05-14 45 views
0

我有一個大數據集到MySQL(用戶,公司,聯繫人)?約100萬條記錄。插入大量數據[PHP,MySQL]

現在我需要從導入文件(csv)導入新用戶,公司,聯繫人約100000條記錄。我從文件記錄了所有三種精華(用戶,公司,聯繫人)的所有信息。 而且對生產我不能使用LOAD DATA(只是沒有那麼多的權利:()

所以存在應被應用到數據集的三個步驟 - 與現有的DB數據 比較 - 更新(如果我們會發現在前面的步驟東西) - 並插入新的記錄

我使用服務器上做這件事的PHP我可以看到兩種方法:

  • 讀取來自所有數據。文件,然後使用這個BIG陣列並應用這些步驟。
  • 或讀取線通過從文件線和穿過步驟

哪種方法更有效的每行? CPU,內存或時間使用情況

我可以使用事務嗎?否則會減慢整個生產系統?

謝謝。

+0

我不認爲你需要找到最有效的方法來做到這一點。對於100K記錄,最多需要20 - 30秒,並且您可能不需要再次插入這些記錄... –

+0

你在開玩笑嗎?我已經實現了第一種方法,它需要很多時間,我敢肯定,你無法想象它是如何工作的;) – user1016265

回答

2

CPU時間/時也不會有它,雖然讀取整個文件將稍快更快。但是,對於如此龐大的數據集,將所有記錄讀入內存所需的額外內存將大大超過時間優勢 - 我一定會一次處理一行。

+1

同意。如果需要原子性,則使用事務。 – eggyal

+0

但在這種情況下,事務應該在使用之前開始並完成,對嗎? – user1016265

+0

@ user1016265取決於你在做什麼。如果某些行引用同一數據集中的其他行,那麼您可能想要在單個事務中包裝所有行,或者至少包含在單個事務中彼此引用的組行(您可能至少需要兩次傳遞方法這個)。如果沒有對同一個表的引用並且沒有循環外鍵,則每行一個事務可能是可接受的。 – DaveRandom

0

您是否知道phpMyAdmin對於大型SQL文件具有「可恢復導入」的漂亮功能?

只是檢查在部分導入部分「允許進口的中斷」。然後,PhpMyAdmin將停止並循環,直到執行完所有請求。

這可能是更有效的只是「使用工具」,而不是「另起爐竈」

+0

我怎樣才能從一個單一的導入文件導入一些幫助phpMyAdmin到三個不同的表? – user1016265

+0

@ user1016265 phpMyAdmin將嘗試創建表格甚至數據庫,但無法確定表格「用戶」何時結束以及表格「公司」何時開始。請參閱[3.18當我導入包含多個表格的CSV文件時,它們被集中到一個表格中。](http://www.phpmyadmin.net/documentation/Documentation.html#faq3_18) –

+0

我知道,但你解決方案不能在我的情況下工作。謝謝 – user1016265

0

我認爲,第二個辦法是更容易接受:

  1. 創建更改列表(這將是一個單獨的表)
  2. 使通過線更新一致(並標記每一行使用「updflag」字段更新,例如)
  3. 使用事務在後臺執行此過程。