2013-02-08 73 views
4

运行本地Mysql实例。在我的数据库中,我拼错了一个列名(延伸到街道)。所以我写了一个查询:MySQL更改EMPTY表上的列名,需要很长时间

alter table address change Stret Street VARCHAR(20); 

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

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

编辑:找到原因。我正在调试一个使用这个数据库的程序,并在中间停止(不终止程序)来更改列名。一旦我停止了tomcat,一切都是即时的。所以大概这张表被锁定了,所以查询被阻止了。我正在使用InnoDB。感谢大家。

+0

什么是您使用的DBEngine? InnoDB,MyIsam ...?另外,整个数据库有多大? – Muc 2013-02-08 19:27:07

+0

服务器日志中的任何内容?什么版本的MySQL?什么O/S和文件系统? – eggyal 2013-02-08 19:28:11

+3

也许表被锁定?你能重现它,并仔细观察它吗? – 2013-02-08 19:29:02

回答

2

你这样做之前,你可能想TRUNCATE TABLE address(速度非常快,但会重置您的AUTO_INCREMENT列计数器)或OPTIMIZE TABLE address(慢一点,但不改变数据),以冲洗掉任何遗留的数据是已删除但未从数据库中清除。

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

2

docs

报价在多数情况下,ALTER TABLE使得原本 表的临时副本。 MySQL等待其他正在修改该表的操作,然后继续执行。 。它将修改合并到副本中,删除原始表格 ,并重命名新的表格。

如果你正使用InnoDB,它上面的甚至单列重命名,同时与MyISAM,它不会创建一个副本,并修改表的frm文件。 这将解释由于内存限制,大型表格可能需要花费的时间。

您可以尝试获得query execution-plan