MySQL之快速ALTER TABLE

对大表来说,修改它的列会导致拷贝整个表到一张新表,因此耗时较多。如用下列代码修改表file,将其默认值由2修改为5。通过SHOW STATUS显示做了1000次读操作和1000插入操作。即拷贝了整张表到一张新表。

ALTER TABLE user.file
MODIFY COLUMN number TINYINT(3) NOT NULL DEFAULT 5;

解决之道:仅修改表的.frm文件而不涉及表数据。
如:

ALTER TABLE user.file
ALTER COLUMN number SET DEFAULT 5;

修改.frm文件

有些操作可能不需要重建表:

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

如何修改.frm文件,关键在于创建一个新的.frm文件,用其代替原表的.frm文件。具体步骤如下:

  • 创建相同结构的空表,并进行必要的修改。
  • 执行FLUSH TABLES WITH READ LOCK。关闭所有正在使用的表,并禁止打开。
  • 替换.frm文件
  • 执行UNLOCK TABLES,释放步骤2的读锁。

快速创建MyISAM索引

将数据高速地载入MyISAM表中,技巧是先禁用索引,载入数据,然后重新启用索引,如下所示。

ALTER TABLE user.file DISABLE KEYS;
---load data
ALTER TABLE user.file ENABLE KEYS;

这个方法对非唯一索引有效,但对唯一索引无效。可行方法如下。

  • 创建一个所需结构的表,但无索引。
  • 载入数据到表中,构建.MYD(MyISAM数据)文件。
  • 按照所需结构另外创建一个空表,包含索引,由此构建.frm文件(MyISAM数据结构)和.MYI(MyISAM索引)文件。
  • 获取读锁并刷新表
  • 重命名第二张表的.frm和.MYI文件,方法如修改.frm文件,让MySQL认为是第一张表的文件。
  • 释放读锁
  • 使用REPAIR TABLE重建表的索引,通过排序来构建所有索引,包括唯一索引。

注意:以上所有方法不受官方支持,亦无文档记录,需要自担风险,因此执行前最好首先备份数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值