1. 程式人生 > >Mysql 提升大資料表的拷貝效率

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的目錄在哪個位置 , 指定這個位置匯出即可;