运行本地Mysql实例。在我的数据库中,我拼错了一个列名(延伸到街道)。所以我写了一个查询:
alter table address change Stret Street VARCHAR(20);
此表刚刚创建并包含零记录。我知道有各种各样的线程询问为什么需要这么长时间,但他们所有的表都有超过100,000行。我一无所有!为什么这个查询需要1小时13分15.76秒?
我知道我可以放弃并重建表格,我只是好奇为什么这个“简单”的改变需要这么长时间?
编辑:找出原因。我正在调试一个使用此数据库并在中间停止的程序(不终止程序)来更改列名。一旦我停止了tomcat,一切都会立即恢复。所以大概是桌子被锁定所以查询被搁置了。我正在使用InnoDB。谢谢大家。
答案 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 。