在使用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创建表的索引