4

运行本地 Mysql 实例。在我的数据库中,我拼错了一个列名(stret to street)。所以我写了一个查询:

alter table address change Stret Street VARCHAR(20); 

该表刚刚创建并包含零条记录。我知道有很多线程在问为什么要花这么长时间,但他们所有的表都有 100,000 多行。我什么都没有!为什么这个查询需要 1 小时 13 分 15.76 秒?

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

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

4

2 回答 2

3

在执行此操作之前,您可能希望TRUNCATE TABLE address(非常快,但会重置AUTO_INCREMENT列计数器)或OPTIMIZE TABLE address(稍微慢一些,但不会更改数据)以清除已删除但未从数据库中清除的任何剩余数据.

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

于 2013-02-08T19:30:22.333 回答
2

文档中引用

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

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

您可以尝试获取查询执行计划

于 2013-02-08T19:33:01.800 回答