InnoDB:ALTER TABLE与NULLability相关的性能?

时间:2012-04-04 22:37:48

标签: mysql innodb

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

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

我试图添加的列的NULL能力是否会显着影响以任何方式添加列所需的时间?

更多信息

我正在执行此操作的上下文是一个Django应用程序,其中包含由South生成的迁移 - 添加三个单独的列,并在其中一个新添加的列上添加索引。查看南方生成的SQL,它会在15 NULL个语句中传播此操作(添加三列和一个索引) - 这似乎会使这个操作花费的时间比它应该要长很多。

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

1 个答案:

答案 0 :(得分:2)

我认为专栏的可空性与ALTER TABLE的速度无关。在大多数alter table操作中,必须复制(暂时)整个表(包括所有索引),然后在副本上完成更改。有10M行,它有点慢。来自MySQL docs

  

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

     

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


如果您想在表格结构中进行多处更改,通常最好在一次ALTER TABLE操作中执行此操作。


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