我有一个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
1条答案
按热度按时间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细节的记忆正在消退。