使用innodb紧凑存储的mysql中的“不小”表添加列很慢

时间:2012-04-20 19:30:48

标签: mysql innodb

有人可以解释为什么在一个innodb紧凑表中添加一个列,其中包含大量数据会很慢吗?

2 个答案:

答案 0 :(得分:2)

使用ALTER TABLE向表中添加列需要重建整个表,这对于大型表来说很慢。

如果要在ALTER运行时继续使用该表,则应考虑使用pt-online-schema-change工具:

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

答案 1 :(得分:0)

从紧凑表的mysql文档中可以看出,每条记录的标题都有一个位,表示该字段是否为空。如果添加一列,则必须更改该标题的大小,这至少会改变该表中所有行的大小。

摘录: 使用COMPACT行格式的InnoDB表中的行具有以下特征:

每个索引记录包含一个五字节标头,前面可能有一个可变长度的标头。标头用于将连续记录链接在一起,也用于行级锁定。

记录头的可变长度部分包含用于指示NULL列的位向量。如果索引中可以为NULL的列数是N,则位向量占用CEILING(N / 8)个字节。 (例如,如果有9到15列可以为NULL,则位向量使用两个字节。)