MySQL DECIMAL 存储

3

你好,我正在使用DECIMAL数据类型创建一个非常大的表格,它将从5000万行开始增长,所以我关心存储。我需要使用DECIMAL来获得精确的表示,文档清楚地说明如果您需要精确的表示,必须使用DECIMAL。

MySQL手册对DECIMAL存储要求非常明确,如下所示:

从MySQL 5.0.3开始,DECIMAL列的值使用二进制格式表示,该格式将9个十进制(基数为10)数字打包成4个字节。每个值的整数和小数部分的存储空间是分别确定的。每九个数字需要四个字节,而“剩余”的数字则需要四个字节的一部分。多余数字的存储需求由以下表格给出。

剩余数字 字节数量
0 0
1 1
2 1
3 2
4 2

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

这意味着DECIMAL(12,4)需要以下存储空间:

8字节用于整数部分和2字节用于'剩余'部分,总计10字节。

首先,问题是,DECIMAL(18,4)不会使用相同的10字节存储吗?如果我想节省存储空间,我需要降低到DECIMAL(9,4),但这对我来说不是一个选项。

如果确实如此,第二个问题是是否有任何想法mysql是否比DECIMAL(18,4)更有效地处理DECIMAL(12,4)?我认为那个问题并非一定能够回答,但我想试一试!也许有人已经做过某种基准测试...

谢谢。

2个回答

6
你的计算有误。
如果我正确理解你链接的页面所描述的,DECIMAL(12,4) 需要:
整数部分有8个数字,因此需要4个字节
小数部分有4个数字,因此需要2个字节
总共需要6个字节。
对于 DECIMAL(18,4),它有14个整数位和4个小数位,因此需要 (4+3)+(2) = 9 个字节。

我理解文档中的“每个九位数字的倍数需要四个字节”是指分配是按照4字节的倍数进行的。因此,9个整数位需要4个字节,如果你使用10个整数位,存储空间会跳到8个字节。也就是说,增量为4个字节。如果我理解有误,请告知,谢谢回复! - Don Wool
顺便说一句,我看到了我的错误,在计算DECIMAL(12,4)的存储时,你确实是正确的,它是6个字节。 - Don Wool

-3

不用想太多,我相信ybercube的答案是正确的。话虽如此,你为什么不自己创建一个表并插入一些数据来轻松测试呢?"show table status"可能会提供你所需的信息。


不确定“show table status”是否是一种确定性地查看表行大小的方法。其中有一列“Avg_row_length”,可能就是它...我猜这被称为平均值,以防表中有varchar()列。也许对于一个没有varchar()的表,“Avg”不是平均值——我会像你建议的那样进行一些测试。谢谢。 - Don Wool
我只是建议从一个空表开始,插入一行填充所有可能的数据到最大,并且显示表状态应该会显示那一行的大小(即表中唯一的一行)。也许我错了? - StudyOfCrying
你说得对!这个完美地运行了。我尝试创建具有不同 DECIMAL(x,y) 列的表,插入数据并使用 'show table status' 来查看长度是多少。谢谢! - Don Wool
@DonWool,你的实验有什么结果了吗? - Mikl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接