这些表格大小有何意义?

时间:2018-01-19 05:38:28

标签: mysql myisam

我有一个MyISAM表,它只包含一个字段,一个SMALL 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 个答案:

答案 0 :(得分:0)

有一些开销。

首先,一些可控制的变量':

myisam_data_pointer_size默认为6(字节) myisam_index_pointer_size默认为少于1。

对于数据(.MYD):

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

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

如果您有3 SMALLINTs,则表格大小相同。

索引(.MYI):

  • BTree组织有一些开销;如果随意建造,它会在大约69%的时间内完成。
  • 每个叶子行都需要一个6字节的指针(字节偏移到.MYD,DYNAMIC)。
  • BTree中的链接是一个5字节的行,由不公开的设置(myisam_index_pointer_size)控制。

所以:row_length +每条记录6,加上一些开销。 46M听起来像是对数据进行了排序,以便建立索引"按顺序"。

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