gpt4 book ai didi

mysql - 这些 table 尺寸有何意义?

转载 作者:行者123 更新时间:2023-11-30 21:48:33 25 4
gpt4 key购买 nike

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

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

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

这是创建表:

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

最佳答案

有一些开销。

首先,一些可控的“变量”:

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

对于数据(.MYD):

  • N 个字节,最多 8*N 个 NULLable 列。 (你的 table N=0。)
  • 1 个字节表示“已删除”。你确实有这个。
  • DELETEd 行留下空白。
  • 当一条记录被删除时,空隙会被一个指向下一条记录的数据指针所填充。这意味着最小的一行可以是 6 个字节。

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

如果您有 3 个 SMALLINT,则该表的大小将相同。

对于索引(.MYI):

  • BTree 组织有一些开销;如果是随机 build 的,它会在大约 69% 的情况下安顿下来。
  • 每个叶行都需要一个 6 字节指针(字节偏移到 .MYD,DYNAMIC)。
  • BTree 中的链接是一个 5 字节的行,由未列出的设置 (myisam_index_pointer_size) 控制。

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

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

关于mysql - 这些 table 尺寸有何意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com