以mysql為例。 遇到這個問題的時候最先想到的方法就是先從各個表中查詢出相應的數據後使用程式迴圈遍歷組裝後在插入到資料庫中。這是最直觀的解決辦法,但是這個方法處理超大結果集的時候就出現問題,例如:超出記憶體限制,運行時間過長等等。。。 這時使用另外一種方法應該會有幫助,那就是使用mysql的on d
以mysql為例。
遇到這個問題的時候最先想到的方法就是先從各個表中查詢出相應的數據後使用程式迴圈遍歷組裝後在插入到資料庫中。這是最直觀的解決辦法,但是這個方法處理超大結果集的時候就出現問題,例如:超出記憶體限制,運行時間過長等等。。。
這時使用另外一種方法應該會有幫助,那就是使用mysql的on duplicate key update方法來分步驟組合數據。
現在有3張表a,b,c。每個表的結構如下:
a表包含欄位:id,a,b,c;
b表包含欄位:aID,d,e,f;欄位aID對應表a中的id
c表包含欄位:aID,a,b,c,d,e,f;欄位aID對應表a中的id
現在要把a表和b表中的數據組合後插入到c表中,其中a和b均包含1000W+的數據,如果採用查詢-》組裝-》插入資料庫的方式,在查詢步驟和組裝步驟均會超出記憶體限制。
這是可以採用如下步驟:
- 從a中查詢出符合條件的數據後插入到c中。例如:
INSERT INTO c (c.aID,c.a,c.b,c.c) SELECT a.id,a.a,a.b,a.c FROM a WHERE a.id<5000000
執行完成大約用時40秒
- 從b表中查詢出符合條件的數據後插入到c中。例如:
INSERT INTO c (c.aID,c.d,c.e,c.f) SELECT b.aID,b.d,b.e,b.f FROM b WHERE b.aID<5000000 ON duplicate KEY UPDATE c.d=VALUES(c.d),c.e=VALUES(c.e),c.f=VALUES(c.f)
執行完成大約用時50多秒
這樣就把a和b中的數據組合插入到了c中。