mysql加快alter table操作速度

1,121 阅读1分钟

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》阅读笔记