这些 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 细节的记忆正在消退。
我有一个 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 细节的记忆正在消退。