这些表大小有什么意义?

yrefmtwq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(302)

我有一个myisam表,它只包含一个字段,一个小int。这个字段上有一个索引,有560万条记录。
所以理论上5.6mil*2字节(smallint)=11mb(大约),但是表的数据文件是40mb,为什么会有这么大的不同呢?
索引文件占用46mb,会比数据文件大吗?
以下是创建表:

CREATE TABLE `key_test` (
  `key2` smallint(5) unsigned NOT NULL DEFAULT '0',
  KEY `key2` (`key2`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
puruo6ea

puruo6ea1#

头顶上有一些。
首先,一些可控的“变量”: myisam_data_pointer_size 默认为6(字节)。 myisam_index_pointer_size 默认值小于1。
对于数据( .MYD ):
n字节最多8*n NULLable 列(n=0表示您的table。)
1字节表示“已删除”。你有这个。 DELETEd 行间留有空隙。
当一条记录被删除时,空白处会被一个指向下一条记录的数据指针所填充。这意味着行的最小长度可以是6字节。
所以:1+最大值(行长度,6)=每行7字节。
如果你有3个 SMALLINTs ,表的大小相同。
对于索引( .MYI ):
btree组织有一些开销;如果是随机构建的,它的容量大约为69%。
每个叶行中都需要一个6字节的指针(字节偏移到.myd,动态)。
btree中的链接是由未列出的设置控制的5字节行( myisam_index_pointer_size ).
所以:每个记录的行长+6,再加上一些开销。46m听起来像是对数据进行了排序,这样索引就“按顺序”建立起来了。
除此之外,我对myisam细节的记忆正在消退。

相关问题