通常情况下,修改表的结构一般不会有太大问题,无非就是一个 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. VUE框架的初识

    VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...

  2. AWS 实战

    AWS (Amazon Web Service) 要使用亚马逊的免费云服务 AWS,必须先注册账号,然后绑定信用卡. 创建 AMI(Amazon Machine Image) 选择 EC2 服务 EC ...

  3. 如何在Python中调用Matlab

    检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...

  4. JS数据类型之String类型

    转换为字符串 var num = 10 num.toString(); //"10" 转换为字符串-参数表示几进制的字符串 var stringValue = "hell ...

  5. jenkins pipline 发送邮件

    推荐一个好网站https://www.w3cschool.cn/jenkins/jenkins-e7bo28ol.html 获取git 用户信息// Get checkout output value ...

  6. 深入理解C++11【5】

    [深入理解C++11[5]] 1.原子操作与C++11原子类型 C++98 中的原子操作.mutex.pthread: #include<pthread.h> #include <i ...

  7. Python学习—数据库篇之SQL语句

    一.数据库级别 1.显示数据库 show databases; 默认数据库: mysql - 用户权限相关数据 test - 用于用户测试数据 information_schema - MySQL本身 ...

  8. windows10安装JIRA

    windows10安装MySQL数据库 一.问题现象: cmd执行“mysql”命令,提示:ERROR 2003 (HY000): Can't connect to MySQL server on ' ...

  9. session的简单应用

    session的作用:服务器端保存信息. 用户登陆后,服务器端保存了 自定义的key:value 如下: if username == 'xxx' and password == 'xxxx': re ...

  10. tensorflow实现二分类

    读万卷书,不如行万里路.之前看了不少机器学习方面的书籍,但是实战很少.这次因为项目接触到tensorflow,用一个最简单的深层神经网络实现分类和回归任务. 首先说分类任务,分类任务的两个思路: 如果 ...