Mysql 提升大資料表的拷貝效率
工作上會經常遇到量級比較大的資料表 ;場景: 該資料表需要進行alter操作 比如增加一個欄位,減少一個欄位. 這個在一個幾萬級別資料量的資料表可以直接進行alter表操作,但是要在一個接近1000W的資料表進行操作,不是一件容易的事;可能情況:1.導致資料庫崩潰或者卡死 2.導致其他程序 進行資料庫讀寫I/O變慢 3.還有一個可能就是資料格式不一致 導致資料無法寫入(比如一個varchar型別要改為int型別,當資料長度過大時會報錯)
解決方案:--
1.重新建立一張資料表 create new_table select * from old_table 這種形式相當於複製一張新的資料表 ----(不建議): 這裡面僅僅複製資料表的欄位和資料 , 但是表結構 主鍵,索引和預設值都不會拷貝過來2.分成兩個步驟
1).create new_table like old_table 建立一個新表,表結構和old_table一致(包含主鍵,索引和預設值等)
2).insert into new_table select * from old_table 把old_table的資料全部拷貝到new_table裡面去
----(如果資料量少的話,在幾萬行左右建議使用此方案, 如果資料量到達數百萬 上千萬時, 這個也是不適用的)
擴充套件: 如果你只要拷貝一部分資料表的話,可以指定 insert into new_table (欄位1,欄位2) select 欄位1,欄位2 from old_table [limit n,m] ;
3.
1).通過select from into outfile 命令來匯出資料表資料
2).通過load data infile into 命令來匯入資料表資料
不多廢話 直接看圖,感受下100萬左右的資料量 方案2 和 方案3 處理速度相差多少
>select * from money_info into outfile '/var/lib/mysql-files/money.txt'; >create table money_info_cyq11 like money_info;>load data infile '/var/lib/mysql-files/money.txt' into table money_info_cyq11;
>create table money_info_cyq22 like money_info;>insert into money_info_cyq22 select * from money_info;
速度在4倍左右,網上說的20倍還沒體驗到[捂臉]
注:這裡還存在一個問題
outfile的目錄是有要求的>show variables like '%secure%';
通過這條命令可以看到secure_file_priv 對應out_file的目錄在哪個位置 , 指定這個位置匯出即可;