我的表格中包含最高签名INT
点击的主键,2147483647
想象一下,我想将它切换为无符号,并且表中没有负值,因为它是主键,因为我目前认为这是让表再次运行的最快方法。
将ALTER TABLE
语句切换为无符号INT
是否应该是一个相对较快的过程,因为ID的值不应该改变?锁定怎么样?
答案 0 :(得分:3)
ALTER TABLE命令上的Mysql文档详细描述了“存储,性能和并发注意事项”部分,这些更改可以快速完成,无需表复制和索引重建,以及mysql将在什么时候应用的锁定命令的过程。遗憾的是,未将列类型更改为可以在适当位置执行的操作(当然,请阅读与您的mysql版本相对应的文档,我只是链接了最新版本)。
对于某些操作,可能没有就地ALTER TABLE 需要临时表:
对于ALTER TABLE tbl_name RENAME TO new_tbl_name没有任何其他选项,MySQL只是重命名对应于表的任何文件 tbl_name没有复制。 (您也可以使用RENAME TABLE 用于重命名表的语句。请参见第13.1.28节“重命名表” 语法“。)专门为重命名的表授予的任何权限 不会迁移到新名称。必须手动更改它们。
仅修改表元数据而非表数据的更改是立即的,因为服务器只需要更改表.frm文件, 不要触摸桌面内容。以下更改是快速更改 可以这样做:
重命名列。
更改列的默认值。
通过添加新枚举或将成员设置到有效成员列表末尾来更改ENUM或SET列的定义 值,只要数据类型的存储大小不变。 例如,将成员添加到具有8个成员的SET列 将每个值所需的存储空间从1个字节更改为2个字节;这个 需要一份表副本。在列表中间添加成员 导致重新编号现有成员,这需要表副本。
ALTER TABLE with DISCARD ... PARTITION ... TABLESPACE或IMPORT ... PARTITION ... TABLESPACE不会创建任何临时表或 临时分区文件。
ALTER TABLE with ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REBUILD PARTITION或REORGANIZE PARTITION不会创建 任何临时表(与NDB表一起使用时除外);然而, 这些操作可以创建临时分区文件。
RANGE或LIST分区的ADD或DROP操作是立即操作或几乎是如此。 HASH或KEY的ADD或COALESCE操作 分区在所有分区之间复制数据,除非LINEAR HASH或 使用LINEAR KEY;这实际上与创建新的一样 表,虽然ADD或COALESCE操作是执行分区 按分区。 REORGANIZE操作仅复制更改的分区和 不要触摸不变的。
重命名索引。
为InnoDB添加或删除索引。
锁定:
执行ALTER TABLE时,原始表可以读取 其他会议(短期内除外)。更新和写入 到ALTER TABLE操作开始后开始的表是 在新表准备好之前停止,然后自动停止 重定向到新表没有任何失败的更新。暂时的 原始表的副本是在数据库目录中创建的 新表。这可能与原始数据库目录不同 用于将表重命名为其他表的ALTER TABLE操作的表 数据库中。
前面提到的异常是ALTER TABLE块读取 (不只是写)准备安装新的 表.frm文件的版本,丢弃旧文件,然后清除 表和表定义高速缓存中过时的表结构。 此时,它必须获得独占锁。为此,它等待 当前读者完成,并阻止新的读取(和写入)。