我做了一个测试,以确保我知道 ENUM 是如何工作的以及它如何处理存储空间......并且得到了与预期不同的结果。
一张表,其中一个类型的字段VARCHAR(100)
填充了 1,000,000 行。每行都有一个从 6 个字符串中随机选择一个的值,长度为 100。
然后,转换为ENUM
,然后返回VARCHAR(100)
。这是结果(数据大小)。
1. 1,000,000 行 = 99.2 MiB,VARCHAR(100)
2. 行 1,000,000 = 6,835.9 KiB,枚举 ('blah100Characters1','blah100Characters2',...,'blah100Characters6')
3. 行 1,000,000 99.2 MiB,VARCHAR(100)
按预期报告的VARCHAR(100)
类型并匹配手册中的 MySQL 规范 ("L + 1 bytes, 0 <= L <= 255") 1,000,000 x 100 = 100,000,000 = 99.2 MiB
---编辑:嗯,加上一个额外的字节,但这与这个讨论无关:o)
但是,根据 ENUM 的 MySQL 规范(“1 或 2 个字节,取决于枚举值的数量(最大 65,535 个值)”),有 6 种可能的组合,我希望每行需要 1 个字节的数据. 1,000,000 x 1 = 1,000,000 = 976.5 KiB
谁能向我解释为什么转换后的表需要 6,835.9 KiB,奇怪的是,这几乎是预期的 7 倍?