InnoDB行元数据大小(最小行大小)

Chr*_*wan 2 mysql innodb metadata

我正在尝试决定是否进一步标准化,并且需要知道 InnoDB 中最小的一行可以是多少(我有 MySQL 5.6)。

这并不完全是我的情况,但为了简单起见,我们假设我只有一个代理 PK (bigint) 和两个 TINYINT 列,它们都不能为空。如果我要存储 10 亿个字节,那么每行需要多少字节来存储?

我想每行都需要一些元数据(我知道至少在存在可空列时需要),但似乎找不到有关如何计算它的文档。

那么,页面中的可用空间和页面中的元数据(或者全部一起)会占用多少空间?

我想知道,以便我可以更好地判断何时会有一个足够窄的长表以避免正确的标准化。

aku*_*sky 5

InnoDB 中的每一行(假设为 COMPACT 格式)都有以下标头:

  • 偏移量 - 每个可变长度类型字段一个或两个字节。
  • NULL 标志 - 每个可 NULL 字段一位,与整数字节对齐。
  • 所谓的“额外字节” - 一堆标志,例如 is_deleted、指向下一条记录的指针等。COMPACT 格式的五个字节,固定。

然后是主键字段。然后是 6 字节事务 ID 和 7 字节回滚指针。然后是剩余的字段值。

对于给定的行(BIGINT、TINYINT、TINYINT),其大小将为:

  • 0 字节偏移量
  • 0 字节 NULL 标志
  • 5 个字节“额外字节”
  • 8 字节 BIGINT
  • 6字节trx_id
  • 7字节roll_ptr
  • 1 字节 TINYINT
  • 1 字节 TINYINT

因此,每条记录 28 个字节。

但要计算表将占用多少空间,您需要考虑:

  • 页头(38+56字节)
  • 页面预告片
  • 页面填充系数
  • 无限,至高记录
  • 非叶子页使用的空间

查看这些幻灯片以了解更多详细信息 http://www.slideshare.net/akuzminsky/data-recovery-talk-on-pluk