加快ALTER TABLE 操作速度

mysql的alter table操作的性能对于大表来说是个大问题。mysql大部分修改表结构操作的方法都是用新的结构创建一个
新表,从旧表中查出数据插入新表,然后在删除旧表。这样的操作很耗费时间,而且还有可能中断mysql服务。
这里推荐一种方法来提高alter table的操作速度。( 请注意数据备份


修改数据表的.frm文件,步骤如下:
1、创建一个有相同结构的新表,并进行所需修改(例如增加ENUM常量值)。
2、执行FLUSH TABLES WITH READ LOCK.加锁禁止打开所有表。
3、交换新表和旧表的.frm文件。
4、执行UNLOCK TABLES解锁。

语句实例:修改列user_status

mysql> desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1')       | NO   |     | NULL    |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+
mysql>create table users_tmp like users;
mysql>alter table users_tmp modify column user_status enum ('0','1','2') default '2';
mysql>desc users_tmp;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1','2')   | YES  |     | 2       |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+
mysql>flush tables with read lock;
#-----------------------------------
这里是shell命令
进入mysql的datadir目录交换.frm文件
[root@localhost /var/lib/mysql/test/] cp -a users.frm users.frm.backup
[root@localhost /var/lib/mysql/test/] mv users_tmp.frm users.frm #这个会直接删除删除新建的表user_tmp
#-----------------------------------
mysql>unlock tables;
mysql>desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1','2')   | YES  |     | 2       |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+



转载于:https://www.cnblogs.com/liuensong/p/10140346.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值