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

MySQL在空表上更改列名,需要很长时间,mysql,performance,Mysql,Performance,运行本地Mysql实例。在数据库中,我拼错了一个列名(stret to street)。所以我写了一个查询: alter table address change Stret Street VARCHAR(20); 此表刚刚创建,不包含任何记录。我知道有各种各样的线程询问为什么需要这么长的时间,但是他们所有的表都有100000多行。我什么都没有!为什么此查询需要1小时13分15.76秒 我知道我本可以放弃并重新创建这个表,我只是好奇为什么这个“简单”的更改会花费这么长时间 编辑:找出原因。我

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

alter table address change Stret Street VARCHAR(20); 
此表刚刚创建,不包含任何记录。我知道有各种各样的线程询问为什么需要这么长的时间,但是他们所有的表都有100000多行。我什么都没有!为什么此查询需要1小时13分15.76秒

我知道我本可以放弃并重新创建这个表,我只是好奇为什么这个“简单”的更改会花费这么长时间


编辑:找出原因。我正在调试一个程序,使用这个DB并在中间停止(不终止程序)来改变列名。一旦我停止了tomcat,一切又都是瞬间的。因此,可能表被锁定,因此查询被暂停。我正在使用InnoDB。谢谢大家。

在执行此操作之前,您可能希望
截断表地址
(非常快,但会重置
自动增量
列计数器)或
优化表地址
(稍微慢一点,但不会更改数据),以便清除任何已删除但未从数据库中清空的剩余数据

另一种方法是
CREATE TABLE\u address LIKE address
,运行对克隆的更改,然后使用
RENAME TABLE
中引用
切换
address

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

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


您可以尝试获取一个

您使用的数据库引擎是什么?InnoDB,MyIsam。。。?还有,整个数据库有多大?服务器日志中有什么内容吗?什么版本的MySQL?什么O/S和文件系统?可能表被锁定了?你能复制它并仔细观察它吗?我在iPython终端中使用Sqlalchemy时一定锁定了我的DB 5次。然后转到更正表属性,它将挂起…duh…锁定。