1. 程式人生 > 實用技巧 >mysql大資料表新增欄位

mysql大資料表新增欄位

方案一、老表資料遷移四部曲方案
1、新建老表t_order_goods的備份表t_order_goods_bak,同時加一個欄位:isVirtual 並給預設值
2、遷移老表t_order_goods資料到備份表t_order_goods_bak中
3、刪除老表t_order_goods
4、新命名備份表t_order_goods_bak表名為t_order_goods
以上的操作步驟2~4建議是在離線的情況下執行,避免在執行遷移資料過程中有新資料進來,導致新表資料流失不完整

方案二、升級MySQL的伺服器版本
1、將現有MySQL版本5.7升級到8.0.12之後的版本
2、然後再執行新增欄位操作

方案一:
優勢:不用再調整業務層的應用程式程式碼,只需要DBA遷移表即可

劣勢:新表可能會跟老表資料不一致,資料不完整;離線操作過長可能會影響其他業務的正常執行
方案二:
優勢:不影響業務層的應用程式程式碼,也不會導致資料丟失
劣勢:升級過程,必然要離線,此過程時間過程一樣會影響業務的正常執行

經驗總結
個人建議在實際情況允許的情況下,如果大家所在的公司也出現類似的問題時,儘可能的還是採用方案三:升級伺服器版本
畢竟長遠考慮,後續在業務的發展不確定情況下,原始表拓展加新的欄位是很正常的一件事,升級到高版本後 因為引入了新的演算法:即時演算法 所以會毫秒級別的加欄位 不會對業務釋出上線造成影響

方案一案例:

為了避免這種問題,記錄一下比較妥帖的辦法

1.建立一個臨時的新表,複製舊錶的結構

create table `tmp` like `goods`;

2.給新表加上新增的欄位

ALTER TABLE `tmp`
    ADD COLUMN `num`  int(10) NOT NULL DEFAULT 0 AFTER `unit`;

3.把舊錶的資料複製過來

insert into tmp(id,name,unit) select id,name,unit from goods;

4.重新命名

rename table goods to goods_bak;
rename table tmp to goods;

一般情況下,一百多萬的資料量,也可以直接進行加欄位操作

但是得看伺服器的執行情況,如果有大量服務佔用記憶體,新增欄位可能會出現問題