Mysql5.7 單表 500萬資料遷移到新表的快速實現方案
開發過程中需要把一個已有500萬條記錄的表資料同步到另一個新表中,剛好體驗下Mysql官方推薦的大資料遷移的方案:
SELECT INTO OUTFILE
,LOAD DATA INFILE
Mysql 關於匯出-匯入檔案的方式處理資料的官方文件地址:
Mysql官方文件
首先把現有表資料匯出到txt檔案中:
SELECT * INTO OUTFILE 'test_9.txt' FIELDS TERMINATED BY ';' FROM f_item s WHERE s.status=1;
我們看到匯出510W+
的資料到txt,耗時53秒
,匯出的txt檔案大小1.18G
左右
然後新建一個表來轉儲存這些資料,使用LOAD DATA INFILE 的方式匯入:
LOAD DATA INFILE 'fxxxx_9.txt' INTO TABLE fxxxxtest FIELDS TERMINATED BY ';' (id, info_id, field_id, element_id, TYPE, @a, @a, @a, @a, @a, VALUE, @a, @a, create_user_id, create_time, @a, @a, @a, @a);
我們看到匯入總共510W+
的資料,總共耗時6分51秒
。
注意到上面匯入的時候,過濾了一些欄位,這些欄位在匯出的原始表中有,但是新表中不需要,所有通過這種宣告欄位列表的方式,以@的方式過濾掉對應的欄位。
這裡還有個小插曲:
在我這個需求中還不是單純的轉移資料,還需要把新表裡面的新增的幾個欄位內容填充,依賴的是另外一個有150多萬條記錄的關聯表裡面的欄位內容。我一開始是按照上面的方式遷移原始資料過去新表後,在SQLyog工具裡面直接通過命令來同步的,類似以下命令:
update table_pre pt, table_union ut set pt.A1 = ut.A1, pt.A2=ut.A2 where pt.union_id=pt.id and pt.status=1;
前面這方案總共耗時將近
1.5 小時
後來想了下,如果直接在SELECT INTO OUTFILE
的時候就把相關聯的欄位一起儲存到txt檔案,然後再通過LOAD DATA INFILE
的方式一次性匯入,豈不是可以一步到位?那這種實現耗時會不會更高效?
結果按照這種思路重新試了一次結果如下:
調整優化方案耗時: 匯出到txt:約23分鐘 匯入表中:約7分鐘 總共耗時:約
0.5小時
相比上面最開始的方法,最後這個方式效率提高了,總耗時只是原來的30%
看來使用第三方工具倒騰資料還是效率比較慢的,當資料量超過1000W以後基本不可取,還是按照Mysql官方推薦的這種方式處理會好點。如果你有更好的方式,歡迎指點一二,謝謝。