1

我有一个有 10M 行的表,我正在尝试ALTER TABLE添加另一列(a VARCHAR(80))。

从数据建模的角度来看,该列应该是NOT NULL- 但运行语句所花费的时间是一个考虑因素,NULL如果有必要,可以更改客户端代码以处理列。

NULL尝试添加的列的能力是否会显着影响添加列所需的时间?

更多信息

我这样做的上下文是一个 Django 应用程序,由 South 生成迁移 - 添加三个单独的列,并在其中一个新添加的列上添加索引。查看 South 生成的 SQL,它将这个操作(添加三列和一个索引)分布在 15ALTER TABLE条语句上——这似乎会使这个操作花费比它应该的更长的时间。

我看到一些参考资料表明 InnoDB 实际上不必在磁盘文件中为可空字段创建字段NULL,而只需修改标头中的位字段。这会影响ALTER TABLE操作的速度吗?

4

1 回答 1

2

我不认为该列的可空性与ALTER TABLE. 在大多数更改表操作中,必须(临时)复制整个表(包括所有索引),然后在副本上进行更改。有 1000 万行,这有点慢。来自MySQL 文档

存储、性能和并发性注意事项

在大多数情况下,ALTER TABLE制作原始表的临时副本。MySQL 等待其他正在修改表的操作,然后继续。它将更改合并到副本中,删除原始表并重命名新表。在ALTER TABLE执行时,原始表可由其他会话读取。在操作开始后开始的对表的更新和写入ALTER TABLE会停止,直到新表准备好,然后自动重定向到新表,而不会出现任何失败的更新。在新表的数据库目录中创建临时表。对于将表重命名为不同数据库的操作,这可能与原始表的数据库目录ALTER TABLE不同。


如果要对表结构进行多项更改,通常最好在一次ALTER TABLE操作中完成。


允许客户端代码在表中进行更改可能不是最好的主意 - 您已经找到了不允许这样做的一个很好的理由。你为什么需要它?如果您不能这样做,出于性能原因,允许您的客户端代码创建一个表(使用新列和现有表的 PK)而不是添加列可能会更好。

于 2012-04-04T22:47:33.997 回答