加快ALTER TABLE 操作的速度
MySQL 的ALTER TABLE 操作的性能对大表来说是个大问题MySQL 执行大部分修改表结构操作的方法是用新的结构创建一个空表从旧表中查出所有数据插入新表然后删除旧表这样操作可能需要花费很长时间如果内存不足而表又很大而且还有很多索引的情况下尤其如此许多人都有这样的经验ALTER TABLE 操作需要花费数个小时甚至数天才能完成
MySQL 以及更新版本包含一些类型的在线操作的支持这些功能不需要在整个操作过程中锁表最近版本的InnoDB 注 也支持通过排序来建索引这使得建索引更快并且有一个紧凑的索引布局
一般而言大部分ALTER TABLE 操作将导致MySQL 服务中断我们会展示一些在DDL操作时有用的技巧但这是针对一些特殊的场景而言的对常见的场景能使用的技巧只有两种一种是先在一台不提供服务的机器上执行ALTER TABLE 操作然后和提供服务的主库进行切换另外一种技巧是影子拷贝影子拷贝的技巧是用要求的表结构创建一张和源表无关的新表然后通过重命名和删表操作交换两张表也有一些工具可以帮助完成影子拷贝工作例如Facebook 数据库运维团队(https://launchpadnet/mysqlatfacebook)的online schema change工具Shlomi Noach 的openark toolkit(http://codeopenarkorg/)以及Percona Toolkit(http://wwwperconacom/software/)如果使用Flexviews(参考 节)也可以通过其CDC 工具执行无锁的表结构变更
不是所有的ALTER TABLE 操作都会引起表重建例如有两种方法可以改变或者删除一个列的默认值(一种方法很快另外一种则很慢)假如要修改电影的默认租赁期限从三天改到五天下面是很慢的方式
mysql> ALTER TABLE sakilafilm
> MODIFY COLUMN rental_duration TINYINT() NOT NULL DEFAULT ;
SHOW STATUS 显示这个语句做了 次读和 次插入操作换句话说它拷贝了整张表到一张新表甚至列的类型大小和可否为NULL 属性都没改变
理论上MySQL 可以跳过创建新表的步骤列的默认值实际上存在表的frm 文件中所以可以直接修改这个文件而不需要改动表本身然而MySQL 还没有采用这种优化的方法所有的MODIFY COLUMN 操作都将导致表重建
另外一种方法是通过ALTER COLUMN 注 操作来改变列的默认值
mysql> ALTER TABLE sakilafilm
> ALTER COLUMN rental_duration SET DEFAULT ;
这个语句会直接修改frm 文件而不涉及表数据所以这个操作是非常快的
返回目录高性能MySQL
编辑推荐
ASPNET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程