通常情况下,修改表的结构一般不会有太大问题,无非就是一个 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. ThinkPHP 整合微信支付 扫码支付 模式二 图文教程

    这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...

  2. windows,mac os与 linux 3系统共存

    硬盘1,C盘 win7 ,D盘 win7文件,E盘 mac os系统 通过easybcd引导, 选项1 ,window 7 选项2,mac --便捷式/外接存储介质(是一个制作好的专门引导mac的工具 ...

  3. (英文版)VScode一键生成.vue模板

    1. 安装vscode,官网地址 2.安装一个插件,识别vue文件 插件库中搜索Vetur,下图中的第一个,点击安装(Install) 3.新建代码片段 点击Code(代码)-Preferences( ...

  4. 如何引入.graphql文件并优雅的使用fragment

    你还在为代码中放入长长的模版字符串所苦恼吗,如下图代码片段: ps:这个是grqphql client在nodejs后端项目的实践,如果你是在前端使用graphql,并使用了webpack,那么这些问 ...

  5. 关于在centos6 + grub的旧版本中,如何关闭CPU throttling

    由于个人需求,要编译安装ATLAS库,其中就有关闭CPU throttling的步骤, 最常规简单的方法是修改grub /etc/default/grub/ 之后再接一些简单的步骤 + 重启就完成了. ...

  6. 初识Scratch 3.0

    之前在帮朋友搜集少儿编程教育资料的时候,发现了麻省理工开发的积木式编程语言的Scratch,最近有空玩了下,感觉很惊艳,我能想象用它做一些有趣的事情,Scratch把编程元素变成像乐高积木一样,可以通 ...

  7. linux 之网络命令

    write 给用户发消息,用户必须在线,以ctrl+d保存结束 语法: write 用户 wall发广播信息(write all)  语法:wall 信息 mail 查看发送电子邮件 发送语法 : m ...

  8. Version Control/Git,SVN

    一.Version Control 1.什么是Version Control 版本控制(Version Control)是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置 ...

  9. Linux下Samba的安装和使用

    一. samba的安装: sudo apt-get insall samba sudo apt-get install smbfs 二. 创建共享目录: mkdir /home/phinecos/sh ...

  10. pyautogui 文档(一):简介

    PyAutoGUI 可实现控制鼠标.键盘.消息框.截图.定位等功能,最近做了个自动化需要这些,故了解并记录下 自动化需要操作win7上的一个app,用PyAutoGUI做的,定位坐标,点击鼠标等,但是 ...