mysql 的 alter table 操做性能小提示

一般状况下,修改表的结构通常不会有太大问题,无非就是一个 alter table 操做,可是对于大表作 alter 操做是一个大问题,请小伙伴们慎重。mysql

 

  mysql执行大部分修改表结构操做方法是建立一个空表,从旧表查询全部的数据插入,而后删除旧表。若是内存不足,或者表很大,并且还有不少索引的状况下,可能须要花费数个小时,甚至数天才能完成。因此若是是操做线上数据库,甚至会影响到服务的正常进行,操做必定要慎重。若有须要能够查询其余方法操做进行。sql

 

在这里,若是是修改列的默认值的话,是有一个小技巧的。列的默认值是在 .frm 文件中的,因此修改默认值是能够直接修改这个文件而不用动到表自己的,可是mysql尚未采用这种优化方法,全部的 modify column 都将重建表。数据库

一般状况下,你们修改表的默认值是:优化

   alter table 表名 modify column 字段 ...... default 值;索引

  这样操做的话,若是表里面有10000条数据,你会发现,这个语句实际上是作了10000次的查询和10000次的插入,也就是拷贝了整张表。但其实你只是想改一个列的默认值而已。内存

 

若是用 alter column 来操做的话,那将是很是快的:字符串

  好比: alter table 表名 alter column 字段 set default 值;table

  这里你会发现只是一瞬间,也不会有多余的查询和插入。技巧

 

从上面的例子咱们看到,只修改表的 .frm 文件是很快的。可是mysql有时候会在没有必要的时候也重建表,若是愿意冒一些险,可让mysql不重建表而作一些其余类型的修改。固然必定要记得备份,由于这个须要本身承担风险。方法

下面这些操做有可能不须要从新建表:

  • 移除(不是增长)一个列的 AUTO_INCREMENT 属性;
  • 增长、移除 或更改 ENUM 和 SET 常量。 若是移除的是已经有行数据用到其值的常量,查询将会返回一个空字符串;

基本的技术就是为想要的表结构建立一个新的 .frm 文件,而后替换掉以前已存在的表的 .frm 文件,像这样:

  1. 建立一张有相同结构的空表,并进行所须要的修改(例如增长 ENUM 的常量);
  2. 执行 FLUSH TABLES WITH READ LOCK 。这将会关闭全部正在使用的表,而且禁止任何表被打开;
  3. 交换 .frm 文件;
  4. 执行 UNLOCK TABLES 来释放第二步的读锁;

注意:再次强调,记得备份。

相关文章
相关标签/搜索