我正在尝试决定是否进一步规范化,并且需要知道 InnoDB 中的最小行是多少(我有 MySQL 5.6)。
这不完全是我的情况,但为了简单起见,我们假设我只有一个代理项 PK (bigint) 和两个 TINYINT 列,它们都不能为空。如果我要有 10 亿个字节,我期望每行需要多少字节来存储?
我想每一行都需要一些元数据(我知道它至少在有 NULLable 列时需要),但似乎无法找到有关如何计算它的文档。
那么,页面中的可用空间和页面中的元数据(或者全部)会占用多少空间?
我想知道这样我就可以更好地判断我什么时候会有一张足够窄的长桌子以避免适当的规范化。
InnoDB 中的每一行(假设 COMPACT 格式)都有这些标题:
然后是主键字段。然后是 6 字节的事务 ID 和 7 字节的回滚指针。然后是剩余的字段值。
对于给定的行(BIGINT、TINYINT、TINYINT),它的大小将是:
因此,每条记录 28 个字节。
但是要计算表格将占用多少空间,您需要考虑:
查看这些幻灯片以获取更多详细信息 http://www.slideshare.net/akuzminsky/data-recovery-talk-on-pluk
(我添加了一个“答案”,而不是出于格式原因的评论。)
@akuzminsky 非常彻底地涵盖了大部分内容。
为什么是 BIGINT?INT UNSIGNED(最大值 40 亿)是否足够?这将节省 4GB。
填充因子有两种形式——
如果写入干净利落地完成,则块已满 15/16。总计可能是 40-45GB
如果有随机 INSERT,则块平均满 69%。
现在。请问为什么要这样布局?这两个 TINYINT 将在十亿行中重复很多次。(特别是,至少 1B/(256*256) = 一些遗嘱对将重复至少 4K 次。)也许你可以只有 65K 行,并且其中有计数器?也许其他一些汇总技术适用于您的应用程序?(好吧,也许这张桌子是人造的。)
顺便说一句,MyISAM 将为该表的数据占用 11GB(假设没有漏洞)。再加上 15-20GB 的 PRIMARY KEY。