mysql大部分执行表结构修改的操作是用一个新的结构创建一个表,再将旧表的数据查出来插入到新表中,然后删除旧表,这是alter table一般的执行过程。这样通常很耗费时间,通常是对大表操作而且有很多索引的时候,问题会更严重。
一般而言,alter table会导致mysql服务中断,能解决这个问题通常有几个技巧:
1、在一台不提供服务的机器上执行alter table,再将主库切换;
2、“影子拷贝”,用新表结构创建一张和源表无关的新表,然后通过重命名和删表操作交换两张表;
注意:并不是所有的alter table都会重建新表(所有modify column操作都会重建表,使用alter column替代)
以下几种操作有可能会重建表
1、移除(并不是增加)一个列的auto_increment属性;
2、增加、移除、更改enum或set常量,如果移除的是一个已使用其值的常量,则查询的时候会返回一个空字符串
基本技术就是为想要的新的表结构创建一个新的 .frm文件,然后用它替换原来的 .frm文件,期间会有 read lock,直到交换表成功则删除lock
关于指定整数类型的宽度
《高性能mysql》阅读笔记