改变列类型 smallint(5) 到 int(11) 太慢了?
ALTER COLUMN TYPE smallint(5) to int(11) horrible slow?
我有一个 MySQL 数据库(Innodb 有 ~5 Mio 行)并且只是想从定义的类型
切换一个未索引的值列
`USERID` smallint(5) unsigned NOT NULL default '0'
属于
类型
`USERID` int(11) unsigned NOT NULL default '0'
所以我只需要它能够存储更大的值(65535 是不够的)。我尝试使用下面的更新,但在 500 万个条目(SSD,4 核)上需要 17 分钟:
ALTER TABLE tbllog MODIFY COLUMN `USERID` int(11) unsigned NOT NULL default '0';
我想知道为什么这需要这么长时间,是否有简单但更快的方法?
经过一番研究和多次测试,我找到了解决方案。最快的方法是首先删除除主索引之外的所有索引(只需要一秒钟)。在此基础上,调用修改(现在只用了 32 秒!),最后重新创建索引。重新创建两个索引需要 1 分钟 44 秒。
所以最后我从 17 分钟减少到不到 3 分钟。
我有一个 MySQL 数据库(Innodb 有 ~5 Mio 行)并且只是想从定义的类型
切换一个未索引的值列`USERID` smallint(5) unsigned NOT NULL default '0'
属于
类型`USERID` int(11) unsigned NOT NULL default '0'
所以我只需要它能够存储更大的值(65535 是不够的)。我尝试使用下面的更新,但在 500 万个条目(SSD,4 核)上需要 17 分钟:
ALTER TABLE tbllog MODIFY COLUMN `USERID` int(11) unsigned NOT NULL default '0';
我想知道为什么这需要这么长时间,是否有简单但更快的方法?
经过一番研究和多次测试,我找到了解决方案。最快的方法是首先删除除主索引之外的所有索引(只需要一秒钟)。在此基础上,调用修改(现在只用了 32 秒!),最后重新创建索引。重新创建两个索引需要 1 分钟 44 秒。
所以最后我从 17 分钟减少到不到 3 分钟。