执行SHOW STATUS操作发现大量的插入操作不存在了,且时间也大大的缩短了(需要先进行FLUSH STATUS)
之所以可能缩短时间是因为
(1)表字段的默认值是放在表的frm(.frm:表结构文件 .MYD:表数据文件 .MYI:表索引)文件中
(2)ALTER COLUMN会更新frm文件,而不会涉及到表的内容
(3)MODIFY COLUMN会涉及到表数据的内容
从前面的列子可以看出如果操作的过程中只涉及到frm文件的改动的话,表结构的更新效率会大大的提高,但是很多时候在没有必要的时候mysql也会进行表的重建。如果你愿意承担风险,可以用修改frm文件的方式以达到提速修改表结的目的
并不是所有的表结构改动都可以通过修改frm文件的方式来提高修改的效率,下面的一些改动可以通过修改frm文件的方式达到更新的目的:
(1) 更改字段的默认值
(2) 增加/删除字段的AUTO_INCREMENT属性
(3) 增加/删除/修改 ENUM的常量值。对于删除操作,如果有字段引用了这个常量值,则在删除后查询的结构为空字符串
下面以更新字段的默认值属性为例,分别通过使用ALTER COLUMN和修改frm文件的方式来提高修改表结构的效率
1 执行ALTER COLUMN
1.1 首先准备一张字典表
| CREATETABLE IF NOT EXISTS dictionary ( id int(10) unsigned NOT NULLAUTO_INCREMENT, word varchar(100) NOT NULL, mean varchar(300) NOT NULL, PRIMARY KEY (`id`) ); |
1.2 插入一些测试数据
|
mysql>DELIMITER $$
mysql>DROP PROCEDURE IF EXISTS SampleProc$$
Query OK, 0rows affected, 1 warning (0.01 sec) CREATEPROCEDURE SampleProc() BEGIN DECLARE xINT; SET x = 1; WHILEx <= 110000 DO insert intodictionary (word, mean) values(concat('a',x),concat('a means',x)); SET x = x + 1; END WHILE; END mysql> DELIMITER ; mysql>call SampleProc(); |
1.3 SHOW STATUS 观察结果Modify Column 以及Alter Column的区别
首先使用MODIFY COLUMN










