2011-11-04 92 views
2

我有一個30萬條記錄的mysql表。MySQL表30萬條記錄插入另一個

有大約20列我將使用15插入到另一個表中。

現在我不能使用PHP來加載這個大型數據集(選擇3000萬行並加載到內存中是不可行的),加載所有這些記錄的最佳方法是什麼? MySQL 5.X

我正在使用EMS連接到數據庫。

+0

你有什麼打算與檢索它們後30M記錄的事 - 你想最終頁結果給客戶?網絡視圖?在後臺處理它們?有多種分頁技術,但這取決於你在做什麼... – bryanmac

回答

3

什麼做的INSERT INTO MySmallerTable SELECT Col1, col2, col3... FROM MyBiggerTable

這可能是值得把它分成多個INSERT

像:

INSERT INTO ... SELECT ... WHERE ID between 1 and 100000;

INSERT INTO ... SELECT ... WHERE ID between 100001 and 200000;

+0

沒錯,使用什麼產品?或函數調用 –

+0

我不能做一個插入選擇在PHP中,因爲它會試圖一次加載所有記錄...分手,限制或之間會導致數據庫指針達到第500萬條記錄和insert 100k –

+0

你可以從mysql命令行執行此操作,而不是從php客戶端執行此操作。任何其他客戶可能會超時。 –

0

你可以做到這一點

INSERT INTO new_table (`col1`,`col2`,`col3`) SELECT `oldcol1`,`oldcol2`,`oldcol3` 
FROM old_table LIMIT 0,100000 

和PHP的循環重複它(不斷變化的極限開始值)

+0

問題在於,如果有任何數據更改,則0到100,000可能不是源表中的相同記錄。您將不得不知道在限制工作的整個過程中,沒有任何數據會發生變化。 – CrazyDart

+0

你可以用兩種方法做到這一點。首先:您可以使用子查詢使用舊錶檢查新表內容。第二:你可以無限制地測試它(我認爲mysql在60分鐘內如此之快)。在其他地方,您可以在新表上定義臨時主鍵並在其中插入舊錶主數據,然後可以插入全部。你也可以在SELECT部分​​使用ORDER BY。 – Huseyin

0

有幾個方法可以包括上面提供一個用戶M_M。我沒有使用EMS,也不確定它能做什麼,不能做什麼。但我已經廣泛使用Workbench。

A.

  • 創建新的目標表
  • INTO SOURCE_TABLE SELECT * FROM DESTINATION_TABLE
  • 創建視圖源表與感興趣
  • LInsert列到目的地從簡單的插入源

B.

  • 使用mysqldump
  • 上傳到新表
  • 修改表通過刪除列不需要