MySQL8.0即时在线加字段instant-add-column

原文地址:https://mysqlserverteam.com/mysql-8-0-innodb-now-supports-instant-add-column/

在MySQL 8.0中迁移到新的事务数据字典使我们的这项工作变得容易得多。在MySQL 8.0之前,元数据(数据字典)存储在称为.frm文件的平面文件中, .frm文件是一种不可思议的格式,已近过时很久了。
该即时加列补丁是由腾讯游戏数据库管理员团队提供的,我们要感谢并感谢腾讯游戏所做的重要而及时的贡献。

以前有什么问题

copy和inplace的存在的问题

新的instant加字段方式

出现的时间点

ALTER TABLE table_name [alter_specification], ALGORITHM=INSTANT;

优势

原理

我们面临的问题是,在立即添加列后元数据发生更改后,如何解析页面上的物理记录?
请注意,此处的物理记录是指存储在聚集索引的叶页中的记录。聚簇索引的现有二级索引甚至非叶页(B树的内部节点)都不会受到影响。
 
InnoDB有两种主要的行格式,即冗余行和紧凑行格式。行格式动态是compact的一个较小变体。压缩及其派生的行格式从冗余行格式中删除了一些元数据,以节省空间。
由于这种“节省空间”的更改,当我们必须对页面上物理行中的数据进行反序列化时,我们总是需要从内部元数据结构中查找元数据。
为了使即时添加列起作用,我们需要为页面上的DYNAMIC和COMPACT行格式的物理记录添加一些元数据。 REDUNDANT行格式不需要此附加元数据,因为列数已存储在物理记录中。
 
额外的信息与数据字典中的一些元数据一起保留在物理记录中。
这与基于相同腾讯补丁的一些下游黑客的做法非常不同,后者在表空间的模糊和未使用的部分存储类似的元数据。
我们认为,将元数据存储在适当的数据字典表中并使其在事务上保持一致将使其更健壮且更自然。此新的元数据存储在物理记录中。
这个新的元数据包括一个存储在info_bits中的标志。 info_bits中的此新信息用于跟踪是否在第一个即时ADD COLUMN之后创建记录。
我们还使用info_bits跟踪物理记录中的字段/列数。当表经历第一个即时ADD COLUMN时的列数以及新添加的列的所有默认值都存储在数据字典中。
这两条信息存储在数据字典表的se_private_data列中。
 
有了这些额外的信息,现在可以立即执行ADD COLUMN操作,而无需修改表中的任何行。如果没有即时的ADD COLUMN,则表中的所有行将采用与以前相同的格式。
即时发出ADD COLUMN后,对该表的任何更新都将以新格式写入行。从数据字典中查找默认值(如果有)。

在每个即时ADD COLUMN中,都会分别跟踪新添加的列的默认值。这些列的默认值可以随时更改。因此,在重建或截断表之后,可以丢弃即时列数和默认值,此外,可以像以前一样将表中的行更改为旧格式。
如果该表是分区表,则不同的分区可能具有不同数量的即时列,并且需要不同数量的默认值。
如果某些分区被重建,截断或重新创建,则分区中的行也可以像以前一样更改为旧格式。

使用限制

使用范围

总结

>> Home

51ak

2024/01/25

Categories: mysql mysql8.0 Tags: 整理

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号