我有一个名为errormsg2
MyISAM 存储引擎的 MySQL 表,其中有大约十几列。
我估计其中两列占据了每行使用的大部分空间,并且它们的数据类型为 TEXT。它们是backtrace
和msg
。
我试图估计每行所需的存储量,但遇到了以下矛盾:
show table status where name = 'errormsg2';
显示(data_length + index_length) / rows
每行大约有 778 个字节。
select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;
显示仅这两列每行平均有 899 个字节的文本。
表格存储的数据怎么可能比它使用的数据多呢?我遗漏了什么?
答案1
需要考虑的一件事是编码问题。例如,UTF-8 对某些字符使用 5 个字节。如果您没有数据或可变数据,数据库将被迫假设最坏的情况:每个字符的长度可能是 5 个字节。因此,它可能会分配比实际需要更多的空间。
请注意,尽管 UTF-16 据称只有 2 个字节,但它也可能存在同样的问题:它必须对 4 个字节长的代理对进行编码。UTF-16 还存在其他多个问题,并且一些主张始终使用 UTF-8