mysql大數據量新增字段的影響有那些?

mysql增加字段相信碼農應該都不陌生,隨手就可以寫出來, sql如下:

ALTER TABLE tbl_tpl ADD title(255) DEFAULT '' COMMENT '標題' AFTER id;

但是線上的一張表如果數據量很大,執行加字段操作就會鎖表,這個過程可能需要很長時間甚至導致服務崩潰,那麼這樣操作就很有風險了。

都有那些影響:

  • mysql 對寫進行鎖操作

  • 如果都是查詢則不會進行加鎖

  • 鎖會導致性能下降

  • 因爲添加字段屬於更新操作,故mysql會把表或者行鎖定,如果表比較大數據在千萬以上會有一定的性能影響

解決方案:

     表結果如下:

CREATE TABLE `test` (
  `name` INT(20) NOT NULL,
  `b` VARCHAR(50) DEFAULT NULL,
  `c` INT(11) NOT NULL DEFAULT '0',
  `d` INT(11) DEFAULT '0',
  `e` VARCHAR(20) CHARACTER SET utf8 DEFAULT NULL,
  `f` VARCHAR(100) CHARACTER SET utf8 DEFAULT '',
  `g` TINYINT(4) DEFAULT '0',
  `username` VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `i` VARCHAR(8) DEFAULT 'unknown',
  `j` TINYINT(4) DEFAULT '0',
  PRIMARY KEY (`name`),
  UNIQUE KEY `idx_username` (`username`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4

數據量:1500萬左右
第一種:

如果業務需求在某一時間段訪問量較小,可以選擇在那個時間段進行新增,如果訪問量較大,可以參考第二種方法

第二種:

在從庫進行加字段操作,然後主從切換

第三種:

1、重新建一張新表tmp_test,把test表的數據copy到新表tmp_test裏,然後給新表加上主鍵,唯一索引。
2、rename表名,切換業務。(將test改爲test_bak,將tmp_test改爲test)
3、由於原test表不停的有數據的insert 和update操作,所以把第一步執行過程中原test表insert和update變動的數據,更新到新test表,可能會存在微小的數據量丟失。

 

如果還有更好的實現方式,歡迎大家進行留言交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章