这些 table 尺寸有何意义?

How do these table sizes make sense?

我有一个 MyISAM table,它只包含一个字段,一个 SMALL INT。该字段上有一个索引,并且有 560 万条记录。

所以理论上 5.6mil * 2 bytes (smallint) = 11MB(大约),但是 table 的数据文件是 40MB,为什么这么不同?

索引文件占46MB,会比数据文件大吗?

这里是创建 table:

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

有一些开销。

首先,一些可控的'variables':

myisam_data_pointer_size 默认为 6(字节)。
myisam_index_pointer_size默认比那个小1。

对于数据(.MYD):

  • N 字节最多 8*N NULLable 列。 (您的 table 为 N=0。)
  • 1 个字节用于 "deleted"。你有这个。
  • DELETEd 行留有空隙。
  • 当一条记录被删除时,空隙会被 data_pointer 填充到下一条记录。这意味着最小的一行可以是 6 个字节。

因此:1 + MAX(row_length, 6) = 每行 7 个字节。

如果您有 3 个 SMALLINTs,则 table 的大小相同。

对于索引(.MYI):

  • BTree组织有一些开销;如果随机构建,它会稳定在 69% 左右。
  • 每个叶行都需要一个 6 字节指针(字节偏移到 .MYD,DYNAMIC)。
  • BTree 中的链接是一个 5 字节的行,由未列出的设置 (myisam_index_pointer_size) 控制。

所以:row_length + 每条记录 6 个,加上一些开销。 46M听起来好像数据排序了所以建了索引"in order".

除此之外,我对 MyISAM 细节的记忆正在消退。