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

  mysql执行大部分修改表结构操作方法是创建一个空表,从旧表查询所有的数据插入,然后删除旧表。如果内存不足,或者表很大,而且还有很多索引的情况下,可能需要花费数个小时,甚至数天才能完成。所以如果是操作线上数据库,甚至会影响到服务的正常进行,操作一定要慎重。如有需要可以查询其他方法操作进行。

在这里,如果是修改列的默认值的话,是有一个小技巧的。列的默认值是在 .frm 文件中的,所以修改默认值是可以直接修改这个文件而不用动到表本身的,但是mysql还没有采用这种优化方法,所有的 modify column 都将重建表。

通常情况下,大家修改表的默认值是:

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

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

如果用 alter column 来操作的话,那将是非常快的:

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

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

从上面的例子我们看到,只修改表的 .frm 文件是很快的。但是mysql有时候会在没有必要的时候也重建表,如果愿意冒一些险,可以让mysql不重建表而做一些其他类型的修改。当然一定要记得备份,因为这个需要自己承担风险。

下面这些操作有可能不需要重新建表:

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

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

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

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

mysql 的 alter table 操作性能小提示的更多相关文章

  1. mySql中alter table的使用

    1.修改表名:alter table 原表名 rename to 新表名; 2.新增列:alter table 表名 add column 列名 varchar(20) ; 3.删除列:alter t ...

  2. mysql 常见ALTER TABLE操作

    删除列 alter table table-name drop col-name; 增加列(单列) alter table table-name add col-name col-type comme ...

  3. mysql报错: 1548-Cannot load from mysql.proc. The table is probably corrupted 解决办法

    use mysql: ALTER TABLE `proc` MODIFY COLUMN `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT N ...

  4. sql语句-ALTER TABLE

    在工作中常遇到要维护数据库表的列,这里主要介绍sql语句中的ALTER TABLE 语句.ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 如需在表中添加列,请使用下列语法: ALTE ...

  5. 加快ALTER TABLE 操作速度

    mysql的alter table操作的性能对于大表来说是个大问题.mysql大部分修改表结构操作的方法都是用新的结构创建一个 新表,从旧表中查出数据插入新表,然后在删除旧表.这样的操作很耗费时间,而 ...

  6. 加快alter table

    mysql的alter table操作的性能对打表来说是个大问题. mysql执行大部分修改表结构的方法是用新的结构创建一个空表,从旧表中查出所有的数据插入新表,然后删除旧表.这样操作就可能需要花费很 ...

  7. alter table导致的mysql事务回滚失败

    今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyI ...

  8. mysql ERROR 1062: ALTER TABLE causes auto_increment resequen

    当我用Navicat尝试修改已有记录的mysql数据表的主键为自动增长时,报出以下错误 1602 ALTER TABLE causes auto_increment resequencing, res ...

  9. 【待整理】MySQL alter table modify vs alter table add产生state不一样

    MySQL:5.6.35 OS:redhat5.8 今天更新数据库某些表字段,有如下两SQL: ①alter table xx modify xxxx;(表大概是77w) ②alter table s ...

随机推荐

  1. U3D学习资料收集

    1,风宇冲的博客 2,gkEngine 3,@浅墨_毛星云 4,聊聊引擎底层如何实现BRDF渲染算法

  2. rm命令详解

    1.简介: rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. 注意:rm是一个 ...

  3. 去除编辑器的HTML标签

    去除HTML携带的标签常用函数 string strip_tags(string str); 编辑器存放内容到数据库时p标签会转换成这种<p></p> 需要使用htmlspec ...

  4. C#客户端和服务端数据的同步传输 (转载)

      客户端: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...

  5. white-space:pre-wrap和word-break:break-all;

    最近碰到了两个css属性,在此记录一下: 1.white-space :nomal规定文本中的文字空格和换行的情况 normal:默认.空白会被浏览器忽略. pre:空白会被浏览器保留.其行为方式类似 ...

  6. gridview 列头自动适应宽度

    Gridview gv=Gridcontrol.MainView as  Gridview; gv.BestFitColumns();

  7. 远程过程调用(RPC)

    在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务. 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获取结果时,该怎么办呢?这就是 ...

  8. Polar Code(1)关于Polar Code

    Polar Codes于2008年由土耳其毕尔肯大学Erdal Arikan教授首次提出,Polar Codes提出后各通信巨头都进行了研究.2016年11月18日(美国时间2016年11月17日), ...

  9. Ubuntu16.04 修改主机名,以及解析主机名

    第一步:修改主机名: vim  /etc/hostname 第二步:修改网络解析名称: vim /etc/hosts 第三步:重启网络配置服务(或者刷新dns): sudo /etc/init.d/n ...

  10. JVM学习04:类的文件结构

    JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理