mysql 的 alter table 操作性能小提示
通常情况下,修改表的结构一般不会有太大问题,无非就是一个 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 文件,像这样:
- 创建一张有相同结构的空表,并进行所需要的修改(例如增加 ENUM 的常量);
- 执行 FLUSH TABLES WITH READ LOCK 。这将会关闭所有正在使用的表,并且禁止任何表被打开;
- 交换 .frm 文件;
- 执行 UNLOCK TABLES 来释放第二步的读锁;
注意:再次强调,记得备份。
mysql 的 alter table 操作性能小提示的更多相关文章
- mySql中alter table的使用
1.修改表名:alter table 原表名 rename to 新表名; 2.新增列:alter table 表名 add column 列名 varchar(20) ; 3.删除列:alter t ...
- mysql 常见ALTER TABLE操作
删除列 alter table table-name drop col-name; 增加列(单列) alter table table-name add col-name col-type comme ...
- 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 ...
- sql语句-ALTER TABLE
在工作中常遇到要维护数据库表的列,这里主要介绍sql语句中的ALTER TABLE 语句.ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 如需在表中添加列,请使用下列语法: ALTE ...
- 加快ALTER TABLE 操作速度
mysql的alter table操作的性能对于大表来说是个大问题.mysql大部分修改表结构操作的方法都是用新的结构创建一个 新表,从旧表中查出数据插入新表,然后在删除旧表.这样的操作很耗费时间,而 ...
- 加快alter table
mysql的alter table操作的性能对打表来说是个大问题. mysql执行大部分修改表结构的方法是用新的结构创建一个空表,从旧表中查出所有的数据插入新表,然后删除旧表.这样操作就可能需要花费很 ...
- alter table导致的mysql事务回滚失败
今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyI ...
- mysql ERROR 1062: ALTER TABLE causes auto_increment resequen
当我用Navicat尝试修改已有记录的mysql数据表的主键为自动增长时,报出以下错误 1602 ALTER TABLE causes auto_increment resequencing, res ...
- 【待整理】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 ...
随机推荐
- VUE框架的初识
VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...
- AWS 实战
AWS (Amazon Web Service) 要使用亚马逊的免费云服务 AWS,必须先注册账号,然后绑定信用卡. 创建 AMI(Amazon Machine Image) 选择 EC2 服务 EC ...
- 如何在Python中调用Matlab
检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...
- JS数据类型之String类型
转换为字符串 var num = 10 num.toString(); //"10" 转换为字符串-参数表示几进制的字符串 var stringValue = "hell ...
- jenkins pipline 发送邮件
推荐一个好网站https://www.w3cschool.cn/jenkins/jenkins-e7bo28ol.html 获取git 用户信息// Get checkout output value ...
- 深入理解C++11【5】
[深入理解C++11[5]] 1.原子操作与C++11原子类型 C++98 中的原子操作.mutex.pthread: #include<pthread.h> #include <i ...
- Python学习—数据库篇之SQL语句
一.数据库级别 1.显示数据库 show databases; 默认数据库: mysql - 用户权限相关数据 test - 用于用户测试数据 information_schema - MySQL本身 ...
- windows10安装JIRA
windows10安装MySQL数据库 一.问题现象: cmd执行“mysql”命令,提示:ERROR 2003 (HY000): Can't connect to MySQL server on ' ...
- session的简单应用
session的作用:服务器端保存信息. 用户登陆后,服务器端保存了 自定义的key:value 如下: if username == 'xxx' and password == 'xxxx': re ...
- tensorflow实现二分类
读万卷书,不如行万里路.之前看了不少机器学习方面的书籍,但是实战很少.这次因为项目接触到tensorflow,用一个最简单的深层神经网络实现分类和回归任务. 首先说分类任务,分类任务的两个思路: 如果 ...