MySql-为什么枚举占用的空间比预期的多?

MySql-为什么枚举占用的空间比预期的多?,mysql,enums,Mysql,Enums,我做了一个测试,以确保我知道枚举如何工作,以及它如何处理存储空间。。。并且得到了与预期不同的结果 一个表,其中一个字段类型为VARCHAR(100),填充了1000000行。每行有一个从6个字符串中随机选择的值,长度为100 然后,转换到ENUM,然后返回到VARCHAR(100)。以下是结果(数据大小) 1。行1000000=99.2 MiB,VARCHAR(100) 2。行1000000=6835.9千磅,枚举 ('Blah100字符1'、'Blah100字符2'、…、'Blah100字符6

我做了一个测试,以确保我知道枚举如何工作,以及它如何处理存储空间。。。并且得到了与预期不同的结果

一个表,其中一个字段类型为
VARCHAR(100)
,填充了1000000行。每行有一个从6个字符串中随机选择的值,长度为100

然后,转换到
ENUM
,然后返回到
VARCHAR(100)
。以下是结果(数据大小)

1。行1000000=99.2 MiB,VARCHAR(100)

2。行1000000=6835.9千磅,枚举 ('Blah100字符1'、'Blah100字符2'、…、'Blah100字符6')

3。行1000000 99.2 MiB,VARCHAR(100)

VARCHAR(100)
类型按预期报告,并与手册中的MySQL规范相匹配(“L+1字节,0它加起来是7字节(我得到相同的结果);一些空间是填充的,一些用于删除标志

若要证明存在填充,请添加额外的枚举(或小整数)。表的大小不会更改

为了证明有一个删除标志,在中间删除一行。表的大小没有变化。

根据,它与默认值为6字节(加上1字节用于删除)的myisam\u数据\u指针大小有关

他似乎是对的,好像我这样做了:

alter table foo MAX_ROWS=10;
表的大小减小了

此外,从中,听起来似乎删除的记录存储为指向下一条记录的指针。如果是这样,则表示任何行的最小空间都是指针大小(默认为6字节)加上一个删除字节。这是因为如果删除一条记录,则设置删除字节,然后使用其他6个字节指向下一条记录


如果您想了解更多信息,我会阅读MyISAM表的“删除链接链”(在使用固定记录计数时)。

看起来好像正在应用一些数据填充,尽管数量不是2次方整;-)您使用的是哪种存储引擎?如何计算大小?存储引擎是MyISAM,我将根据“结构底部的空间使用”表“在phpMyAdmin中显示该表的区域。您能否显示
的输出,如'tablename'\G
?我的输出有点蹒跚,但我可以说它的状态是:Engine=MyISAM,Version=10,rows=1000000,AvgRowLength=7,DataLength=7000000,MaxDataLength=1970324836974591,Indexlength=1024Hey,我想您已经知道了。”。我发现了这个,默认值是6个字节,加上1,我的数据实际引用字节是7。@Rickaroo,我很确定额外的字节是用于delete标志的。每个记录都有一个隐藏的删除标志。枚举的字节是为可能的行指针保留的6个字节的一部分。(如果delete标志为0,那么它知道6个字节属于您的数据。)我相信这只适用于具有固定长度的记录。i、 例如,您的varchar版本不是固定长度的,所以它没有得到相同的delete+指针处理。当我没有指定我的表的最大长度将更短时,它只分配6个字节,知道表可能会变大,并且需要它们进行行索引?我学到的一件事是,虽然我假设VARCHAR没有添加值,但事实上,VARCHAR(100)单个字段的行长度为104。所以我的错误是假设VARCHAR没有填充。谢谢