首页  >  文章  >  后端开发  >  [Mysql]一张1000W条记录的表中,修改表结构,为一个enum字段增加一个值,需要多久时间?

[Mysql]一张1000W条记录的表中,修改表结构,为一个enum字段增加一个值,需要多久时间?

WBOY
WBOY原创
2016-06-06 20:49:191893浏览

Mysql5.5 表为InnoDB,字段为名为type,为普通字段,不被包含在任何索引/主键中。

type字段本来拥有两个值 'a' , 'b' ,我现在要为其加上值 'c' ,于是有了修改语句:

<code>ALTER TABLE `table` MODIFY COLUMN `type` enum('a','b','c');
</code>

我现在想知道我执行上面这条语句大约要消耗多久的时间?

我主要是想知道因为该字段不涉及索引,修改所消耗的时间跟该表的1000w记录有关系吗

大家帮我预估一下,我好有个停机时间的计划准备,谢谢!

回复内容:

Mysql5.5 表为InnoDB,字段为名为type,为普通字段,不被包含在任何索引/主键中。

type字段本来拥有两个值 'a' , 'b' ,我现在要为其加上值 'c' ,于是有了修改语句:

<code>ALTER TABLE `table` MODIFY COLUMN `type` enum('a','b','c');
</code>

我现在想知道我执行上面这条语句大约要消耗多久的时间?

我主要是想知道因为该字段不涉及索引,修改所消耗的时间跟该表的1000w记录有关系吗

大家帮我预估一下,我好有个停机时间的计划准备,谢谢!

最近在看高性能mysql(第三版),里面讲到了这个。 modify column会导致重建表(内部实现是建一个最新结构的表,然后导入数据,然后删除旧表,重命名新表为旧表名),所以会比较慢 使用alter table xxx alter column 则是直接修改.frm文件所以会很快。跟表数据有多少无关。

另一个做法其实原理一样,都是修改.frm文件: 1.创建一个新机构的新表 2.flush tables with read lock.关闭正在使用的表,并且禁止任何表被打开。 3.交换.frm文件 4.unlock tables释放第二步的锁。

最近几晚上看的,没亲自试过,话说我也该去测试下了

<code>static long getAlterTable(){

if(数据库没备份){
  do备份
  getAlterTable(); 
 }else{
   return test alter table time
 }
};
</code>

可以看下percona的在线修改表结构。支持在线修改。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn