我正试图决定是否进一步规范一件事情,并且需要知道InnoDB中最小的一行可以是什么(我已经得到了MySQL 5.6)。
这并不完全是我的情况,但为了简单起见,让我们假设我只有一个代理程序PK (bigint)和两个TINYINT列,两者都不能为null。如果我要拥有10亿字节的存储空间,那么每一行需要多少字节?
我设想每一行都需要一些元数据(我知道至少在有NULLable列时需要元数据),但似乎找不到关于如何计算它的文档。
那么,我可以期望被页面中的空闲空间和页面中的元数据吃掉多少(或者所有这些都在一起)?
我想知道,这样我才能更好地判断什么时候我会有一张狭小的长桌,以避免适当的正常化。
发布于 2015-03-02 22:31:50
InnoDB中的每一行(假设为紧凑格式)都有以下标题:
接着是主键场(S)。然后是6个字节事务id和7个字节回滚指针。那么剩余的字段值。
对于给定的行(BIGINT、TINYINT、TINYINT),它的大小为:
所以,每条记录有28个字节。
但是,要计算表的空间,您需要考虑到:
查看这些幻灯片以获得更多详细信息http://www.slideshare.net/akuzminsky/data-recovery-talk-on-pluk
发布于 2015-03-03 07:02:44
(我添加的是“答案”,而不是出于格式化原因的评论。)
@akuzminsky完全涵盖了大多数事情。
为什么是BIGINT一个不带符号的INT (最大值40亿)不就足够了吗?这样可以节省4GB。
填充因子有两种口味--
如果写干净了,那么块就满了15/16。总计可能是40-45 40。
如果有随机插入,那么块平均满69%。
现在。让我们问一下为什么会有这样的布局?这两个TINYINT将在10亿行中重复多次。(特别是,至少1B/(256*256) =某些威尔对将至少重复4K次。也许你可以只有65K行,并在其中有计数器?也许其他的总结技巧会对您的应用程序有用?(好吧,也许这张桌子是人造的。)
顺便说一句,MyISAM将为该表的数据取11 no (假设没有漏洞)。加上主键的另一个15-20GB。
https://dba.stackexchange.com/questions/94222
复制相似问题