我有一个主键为max的表,INT hit,2147483647
假设我想将它切换到无符号,并且表中没有负值,因为它是主键,因为我目前认为它是使表重新运行的最快方法。
ALTER TABLE语句将其转换为无符号INT是否应该是一个相对较快的过程,因为ids的值不应该更改?那锁呢?
发布于 2015-12-18 09:52:02
Mysql关于变更表命令的文档在“存储、性能和并发考虑事项”小节中详细描述了这些更改可以快速完成,而无需表复制和索引重建,以及在命令过程中将应用什么锁。不幸的是,没有将更改列类型列为可以执行的操作(当然,请阅读与mysql版本相对应的文档,我刚刚链接了最新版本)。
对于某些操作,不需要临时表的就地ALTER是可能的: 对于没有任何其他选项的ALTER tbl_name重命名为new_tbl_name,MySQL只需重命名任何对应于表tbl_name的文件,而无需复制。(还可以使用RENAME TABLE语句重命名表。见第13.1.28节,“重命名表语法”)任何专门为重命名表授予的特权都不会迁移到新名称。它们必须手动更改。 修改只修改表元数据而不修改表数据的更改是即时的,因为服务器只需要更改表.frm文件,而不需要更改表内容。以下更改是可以以这种方式进行的快速更改:
锁定:
当ALTER正在执行时,原始表可以被其他会话读取(除了不久就会注意到的例外)。更新并写入在ALTER操作开始后开始的表,直到新表准备就绪,然后自动重定向到新表,而不会发生任何失败的更新。原始表的临时副本在新表的数据库目录中创建。对于将表重命名为不同数据库的ALTER操作,这可能与原始表的数据库目录不同。 前面提到的例外情况是,ALTER块在准备安装新版本的表.frm文件、丢弃旧文件并清除表和表定义缓存中过时的表结构时读取(而不仅仅是写)。此时,它必须获得一个独占锁。为此,它等待当前读取器完成,并阻止新的读取(和写入)。
https://stackoverflow.com/questions/34352297
复制相似问题