1. 程式人生 > >Mysql5.7 單表 500萬資料遷移到新表的快速實現方案

Mysql5.7 單表 500萬資料遷移到新表的快速實現方案

開發過程中需要把一個已有500萬條記錄的表資料同步到另一個新表中,剛好體驗下Mysql官方推薦的大資料遷移的方案:SELECT INTO OUTFILELOAD 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;

結果就這個同步過程(table_pre表資料510萬+,table_union資料150萬+)總共耗時1個多小時…

前面這方案總共耗時將近1.5 小時

後來想了下,如果直接在SELECT INTO OUTFILE 的時候就把相關聯的欄位一起儲存到txt檔案,然後再通過LOAD DATA INFILE 的方式一次性匯入,豈不是可以一步到位?那這種實現耗時會不會更高效? 結果按照這種思路重新試了一次結果如下:

調整優化方案耗時: 匯出到txt:約23分鐘 匯入表中:約7分鐘 總共耗時:約0.5小時 相比上面最開始的方法,最後這個方式效率提高了,總耗時只是原來的30%

看來使用第三方工具倒騰資料還是效率比較慢的,當資料量超過1000W以後基本不可取,還是按照Mysql官方推薦的這種方式處理會好點。如果你有更好的方式,歡迎指點一二,謝謝。