MySQL 大数据量修改表结构问题
前言:
在系统正常运作一定时间后,随着市场、产品汪的需求不断变更,比较大的一些表结构面临不得不增加字段的方式来扩充满足业务需求;
而 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 大数据量修改表结构问题的更多相关文章
- mysql5.5大数据量下表结构升级
升级一张4万多行(增加一个字段),且包含blob字段的表(blob字段包含100KB左右的数据),运行alter语句:ALTER TABLE `imgdetail` ADD COLUMN `uplo ...
- 【1】MySQL大数据量分页查询方法及其优化
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- MySQL大数据量分页查询
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- MySQL 大数据量快速插入方法和语句优化
MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例 ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...
- MySQL大数据量分页性能优化
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- Mysql 大数据量导入程序
Mysql 大数据量导入程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- MySQL大数据量快速分页实现(转载)
在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢? 般刚开始学SQL语句的时候,会这 ...
随机推荐
- 数据库之MySQL(二)
数据表基本 1.创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空)ENGINE=InnoDB DEFAULT CHARSET=utf8 是 ...
- 启动hive --service metastore &出现Missing Hive Execution Jar: /opt/apache-hive-1.2.0-bin//lib/hive-exec-*.jar
原因:出现上述问题通常是运行hive 在bin/目录下的脚本所致. 解决办法:就是让HIVE_HOME变量指向hive-trunk/build/dist目录,将$HIVE_HOME/bin添加到PAT ...
- Mac 安装Minikube
环境信息: guoguo-MacBook-Pro-3:~ guoguo$ docker versionClient: Version: 17.12.0-ce API version: 1. ...
- Vue:实践学习笔记(3)——组件使用
Vue:实践学习笔记(3)——组件使用 全局注册 1.注册组件 Vue.component('my-component',{ //选项 }) 说明:my-component就是注册的组件自定义的标签名 ...
- loadrunner之脚本篇——代理录制
版本:Loadruner 11.0 A.PC端录制Web应用程序 步骤1:根据实际情况,选择对应的协议 本例中选择Web(HTTP/HTML),如下 步骤2:找到代理设置界面 点击 Start Rec ...
- 20145230 《Java程序设计》第8周学习总结
20145230 <Java程序设计>第8周学习总结 教材学习内容 NIO与NIO2 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区(Buffer)容量 ...
- 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门
3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...
- [Android]动态加载/热部署框架汇总
1.DroidPlugin 用途:动态加载 使用案例:360手机助手 GitHub地址:https://github.com/Qihoo360/DroidPlugin ppt介绍:https://gi ...
- POI实现数据的导入
1.POI技术的概述? POI技术:apache POI是可以对微软office文档进行读和写的工具. l HSSF:操作97格式的excel,扩展名:.xls 纯二进制,最大行数65535. l X ...
- oracle 导出
一.导出csv文件 利用Oracle中的Spool缓冲池技术可以实现Oracle数据导出到文本文件. 1).在Oracle PL/SQL中输入缓冲开始命令,并指定输出的文件名: spool /tmp/ ...