您的位置:首页 > 数据库 > MySQL

MySQL笔记(高效的ALTER TABLE)

2010-12-09 23:14 204 查看
在使用alter table进行表修改时,可能会引起很大的消耗,比如会新建一个空表,并进行数据转储,再删除旧表,而当表很大或者有许多索引时,将需要更大的代价,

alter table可以使用ALTER COLUMN、MODIFY COLUMN、CHANGE COLUMN来修改列

ALTER COLUMN:用于指定列的新默认值,或删除旧的默认值。如果旧的默认值被删除同时列值为NULL,则新的默认值为NULL。如果列值不能为NULL,MySQL会指定一个默认值;

MODIFY COLUMN:用于对列名进行重命名,如将a修改为b:ALTER TABLE CHANGE a b INT.如果想改变列的类型而不是名字,也需要指定新,旧列名,可以设定为相同。

CHANGE COLUMN:改变列的类型,无需重新命名

如:ALTER TABLE t1 MODIFY b BIGINT



修改表名:ALTER TABLE <table> RENAME TO new_tbl_name,此时无需创建临时表

删除索引、列:ALTER TABLE <table> DROP <index_name>|<column>



在上述操作中,ALTER COLUMN无需构建新表,仅仅是修改了文件.frm,该文件用于保存表的模式信息。



可以通过修改frm文件,来进行表的修改,可以执行的操作包括:

1.移除列的AUTO_INCREAMENT属性

2.添加、删除、更改ENUM和SET常量

主要步骤包括:

1.创建一个布局完全一样的表,并修改需要改变的地方

2.执行FLUSH WITH READ LOCK ,关闭所有正在使用的表并防止表被打开

3.交换.frm文件

4.UNLOCK TABLES

5.删除辅助表



为了对MyISAM的表高速加载数据,可以在加载数据前执行

ALTER TABLE <table> DISABLE KEYS

当数据加载完毕后,在执行

ALTER TABLE <table> ENABLE KEYS

通过这种方式,等所有数据加载完毕后才创建索引,而非加载的过程中创建,从而提高了效率,但DISABLE KEYS仅适用于非唯一索引



另外一个方法是通过新构建表来实现,主要步骤为:

1.创建一个有需要的结构的表(不包括索引),加载数据,以构建MYD文件

2.创建另外一个相同的表(包括索引),构建FRM和MYI文件

3.FLUSH WITH READ LOCK

4.重命名第二个表的FRM和MYI文件,更换名字为第一个表。

5.UNLOCK TABLES。

6.使用REPAIR TABLE创建表的索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: