【问题标题】:Mysql DECIMAL storageMysql十进制存储
【发布时间】:2012-02-05 21:27:24
【问题描述】:

您好,我正在使用 DECIMAL 数据类型创建一个非常大的表。从那里开始和增长将有 5000 万行,所以我关心存储。我需要 DECIMAL,因为我需要精确的表示,并且文档很清楚,如果您想要精确的表示,您必须使用 DECIMAL。

mysql 手册对 DECIMAL 存储要求非常清楚,说明:

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

剩余数字字节数
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(12,4) 是否比 DECIMAL(18,4) 更有效(内部)?我认为这个问题不一定可以回答,但我想我会试一试!也许有人做了某种基准测试......

谢谢。

不要

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你的计算错了。

    如果我正确理解您链接到的页面描述的内容,则 DECIMAL(12,4) 将需要:

    整数部分是 8 位,所以是 4 个字节

    小数部分是 4 位,所以是 2 个字节。

    总共是 6 个字节。

    对于DECIMAL(18,4),它有 14 个整数和 4 个小数,它需要 (4+3)+(2) = 9 个字节。

    【讨论】:

    • 我将文档解释为“每个 9 位数字的倍数需要 4 个字节”,表明分配是以 4 个字节的倍数完成的。因此 9 个整数位需要 4 个字节,如果您使用 10 个整数位,则存储会跳转到 8 个字节。也就是说,增量为 4 个字节。如果我对此有误,那将是了解您的回复的有用信息!
    • 哦,顺便说一句,我在计算 DECIMAL(12,4) 的存储空间时看到了错误,你确实是正确的,它是 6 个字节..
    【解决方案2】:

    不用多想,相信ybercube有正确的答案。话虽如此,您就不能继续自己通过创建一个表并进行一些插入来轻松地测试它吗? “显示表状态”应该有你需要的信息。

    【讨论】:

    • 不确定“显示表状态”是否是一种确定性地查看表行大小的方法。有一列“Avg_row_length”可能是它。我猜它被称为平均值,以防表中有 varchar() 列。也许对于其中没有 varchar() 的表,那么“Avg”不是平均值 - 我会按照您的建议进行一些测试 Thx。
    • 我只是建议从一个空表开始,插入一行,将所有可能的数据填充到最大值,并显示表状态应该显示该行的大小(即表中的唯一行)。也许我错了?
    • 你是对的!这工作得很好。我尝试使用不同的 DECIMAL(x,y) 列创建表,插入数据并使用“显示表​​状态”来查看长度。谢谢!
    • @DonWool 你从实验中得到了一些结果吗?
    猜你喜欢
    • 2016-09-06
    • 2013-05-13
    • 2010-12-15
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2011-04-10
    • 2020-11-06
    • 2016-06-10
    相关资源
    最近更新 更多