有人可以解释为什么在一个innodb紧凑表中添加一个列,其中包含大量数据会很慢吗?
答案 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,则位向量使用两个字节。)