MySQL在EMPTY表上更改列名,需要很长时间

时间:2013-02-08 19:25:06

标签: mysql performance

运行本地Mysql实例。在我的数据库中,我拼错了一个列名(延伸到街道)。所以我写了一个查询:

alter table address change Stret Street VARCHAR(20); 

此表刚刚创建并包含零记录。我知道有各种各样的线程询问为什么需要这么长时间,但他们所有的表都有超过100,000行。我一无所有!为什么这个查询需要1小时13分15.76秒?

我知道我可以放弃并重建表格,我只是好奇为什么这个“简单”的改变需要这么长时间?

编辑:找出原因。我正在调试一个使用此数据库并在中间停止的程序(不终止程序)来更改列名。一旦我停止了tomcat,一切都会立即恢复。所以大概是桌子被锁定所以查询被搁置了。我正在使用InnoDB。谢谢大家。

2 个答案:

答案 0 :(得分:2)

在您执行此操作之前,您可能需要TRUNCATE TABLE address(非常快但会重置您的AUTO_INCREMENT列计数器)或OPTIMIZE TABLE address(有点慢,但不会更改数据)命令清除所有已删除但未从数据库中清空的剩余数据。

另一种方法是CREATE TABLE _address LIKE address,对克隆进行更改,然后使用_address切换address RENAME TABLE

答案 1 :(得分:2)

docs

引用
  

在大多数情况下,ALTER TABLE会制作原始文件的临时副本   表。 MySQL等待修改表的其他操作,   继续。它将更改合并到删除中   原始表,并重命名新表。

如果您使用的是InnoDB,它会执行上述甚至单列重命名,而使用MyISAM时,它不会创建副本并修改表的frm文件。 这可以解释由于内存限制,对于大型表可能花费的时间。

您可以尝试获取 query execution-plan