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表,可能会存在微小的数据量丢失。

 

如果还有更好的实现方式,欢迎大家进行留言交流。

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