前言:

  在系统正常运作一定时间后,随着市场、产品汪的需求不断变更,比较大的一些表结构面临不得不增加字段的方式来扩充满足业务需求;

   而 MySQL 在体量上了千万、亿级别数据的时候,Alter Table 的操作,可以让你等一天,而且在高峰期执行这种 SQL 让你的数据库也承担着压力。

  第一时间想到的解决方案就是新建一张表,去掉索引等关联关系,然后加上需要修改的字段,接着写上 insert select 语句进行导数据,  

  后面发现加上重建索引的操作,时间上几乎没有出入;

  针对这种问题,赶紧翻翻 《高性能 MySQL》 ,里面有写出一种解决方案,与大家分享一下。

一、工具

  // “影子拷贝”,针对不同的场景而言的方式,在一台不提供服务的机器上执行 Alter Table 操作,然后和提供服务器的机器进行切换;

  Facebook 数据库运维团队的“online scherma change”工具:

    https://launchpad.net/mysqlatfacebook

  Shlomi Noach 的 openrak toolkit 工具:

    https://launchpad.net/mysqlatfacebook

  // 不是所有的 Alter Table 操作都会引起表重建。

二、修改 .frm 文件

  // .frm MySQL 数据库表结构定义文件;(.myd 数据文件、.myi 索引文件、.idb 数据&索引文件 [前者 MyISAM 后者 InnoDB])

  修改 .frm 文件非官方支持的,也没有文档记录,并且也有可能无法正常工作了,采用这些技术自己承担风险,做好备份!

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

  1、移除(不是增加)一个列的 AUTO_INCREMENT 属性。

  2、增加、移除,或更改 ENUM 和 SET 常量。如果移除的是已有行数据用到其值的常量,查询将会返回一个空字符串。

  基本的技术是为想要的表结构创建一个新的 .frm 文件,然后用它替换掉已经存在的那张表的 .frm 文件,如下:

  1、创建一张有相同结构的空表,并进行所需要的修改(例如增加 ENUM 常量);

  2、执行 FLUSH TABLES WITH READ LOCK。这将会关闭所有正在使用的表,并且禁止任何表被打开;

  3、交换 .frm 文件;

  4、执行 UNLOCK TABLE 来释放第 2 步的读锁;

  假如我们需要为那些对电影更加谨慎的父母们增加一个 PG-14 的电影分级:

  

   注意,我们是在常量列表的末尾增加一个新的值。如果把新增的值放在中间,

  例如 PG-13 之后,则会导致已存在的数据的含义被改变:已经存在的 R 值将变成 PG-14,

  而已经存在的 NC-17 将成为 R,等等。

  

  接下来用操作系统的命令替换 .frm 文件:

/var/lib/mysql/sakial# mv film.frm film_tmp.frm
/var/lib/mysql/sakial# mv film_new.frm film.frm
/var/lib/mysql/sakial# mv film_tmp.frm film_new.frm

  再回到 MySQL 命令行,现在可以解锁并查看变更后的效果了:

UNLOCK TABLES;
SHOW COLUMNS FROM sakila.film LIKE 'rating'\G

  最后需要做的就是删除这个临时的辅助表了。

MySQL 大数据量修改表结构问题的更多相关文章

  1. mysql5.5大数据量下表结构升级

    升级一张4万多行(增加一个字段),且包含blob字段的表(blob字段包含100KB左右的数据),运行alter语句:ALTER TABLE `imgdetail` ADD COLUMN  `uplo ...

  2. 【1】MySQL大数据量分页查询方法及其优化

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  3. MySQL大数据量分页查询

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  4. MySQL 大数据量快速插入方法和语句优化

    MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例 ...

  5. mysql大数据量下的分页

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  6. MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化   ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...

  7. MySQL大数据量分页性能优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  8. Mysql 大数据量导入程序

    Mysql 大数据量导入程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  9. MySQL大数据量快速分页实现(转载)

    在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢?     般刚开始学SQL语句的时候,会这 ...

随机推荐

  1. java 对象与二进制互转

    来自 : http://blog.csdn.net/luckyzhoustar/article/details/50402427 /** * @FileName: ByteToObject.java ...

  2. MySQL中Cardinality值的介绍

    1)         什么是Cardinality 不是所有的查询条件出现的列都需要添加索引.对于什么时候添加B+树索引.一般的经验是,在访问表中很少一部分时使用B+树索引才有意义.对于性别字段.地区 ...

  3. Python3 面向对象(1)

    面向.概述 面向过程: 根据业务逻辑从上到下写垒代码面向过程的设计的核心是过程,过程即解决问题的步骤, 面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西 优点: 极大降低了程序的 ...

  4. Linux安装配置

    虚拟机配置Linux镜像文件 配置网路 防火墙 一.虚拟机配置Linux镜像文件 1.将下载好的Linux镜像文件载入进来 2.启动虚拟机,安装 3.此步为是否检测linux系统,我们选择" ...

  5. always on 技术

    always on 技术系列:https://blog.csdn.net/dba_huangzj/article/details/54015470 MSSQL 2014 /WIN SERVER 200 ...

  6. 玩转type类型(牛逼克拉斯 )

    一.前言 一说起type()方法肯定有很多人都知道这不就是查看某个对象类型的嘛,其实不然,他还有更牛逼的应用------创建类 >>> type(1) <class 'int' ...

  7. Python基础之socket编程(Day29)

    一.客户端/服务器架构 1.硬件c/s架构(打印机) 2.软件c/s架构 互联网中处处是c/s架构 浏览的网页就是如此 C/S架构与socket的关系 socket就是为了完成c/s架构的开发 二.s ...

  8. node.js应用生成windows service的plugin——winser

    from:http://xiaomijsj.blog.163.com/blog/static/89685520135854036206/ 针对项目中windows server machine 不断重 ...

  9. Informatica can bind a LONG value only for insert into a LONG column Oracle

    Informatica实现etl同步表数据信息时 报: Severity Timestamp Node Thread Message Code Message ERROR 2016/8/8 17:32 ...

  10. oc字符串+数组+字典操作题目

    1. 判断中间目录是否存在 (10分) 比如 传入字符串 @"/home/qianfeng/oc.txt" 和 @"qianfeng" 返回:YES 传入字符串 ...