MySQL中的Decimal和Int有什么区别?

13

decimal(10,0) unsigned 类型和 int(10) unsigned 类型之间有性能差异吗?


性能差异取决于使用和基数,您能指定典型的行数吗?是否需要在列上创建索引(在连接或where条件中频繁使用),以及是否对该列进行任何计算/聚合? - Unreason
4个回答

22
可能取决于您使用的MySQL版本。请参见此处
在MySQL 5.0.3之前,DECIMAL类型被存储为字符串,通常会更慢。 然而,自MySQL 5.0.3以来,DECIMAL类型以二进制格式存储,因此对于您上面的DECIMAL大小,性能差异可能不大。
主要的性能问题将是不同类型所占用的空间量(DECIMAL较慢)。在MySQL 5.0.3+中,这似乎不再是一个问题,但如果您将作为查询的一部分对值执行数字计算,则可能会有一些性能差异。这可能值得测试,因为我在文档中没有看到任何迹象。
编辑: 关于int(10) unsigned,我只是按字面意思理解它为4字节整数。但是,这具有最大值4294967295,严格来说并不能提供与DECIMAL(10,0) unsigned相同的数字范围。
正如@Unreason指出的那样,您需要使用bigint来覆盖10位数字的全部范围,将大小推高到8个字节。
常见错误是,在MySQL中指定数字列类型时,人们经常认为括号中的数字会影响他们可以存储的数字大小。但实际上,数字范围纯粹基于列类型以及它是否带符号。括号中的数字只用于结果的显示目的,在存储在列中的值上没有影响。除非您在列上同时指定了 ZEROFILL 选项,否则它也不会对结果的显示产生影响。

那么我相信这将对一个800万行的表产生非常大的影响? - TheOnly92
1
在MySQL 5.1之前,您的十进制数将占用约10个字节,而int只需4个字节。因此,它将占用更多的内存和磁盘空间用于数据和索引。但是,如果您的服务器没有出现问题,则对于典型查询可能仍然没有明显的差异。这将取决于您如何使用它以及内存使用情况,以及索引和其他一系列因素。 - Jarod Elliott
2
@Jarod:我给你+1因为我不知道这些细节,但是根据提供的链接,我有两个更正-“从MySQL 5.0.3开始,DECIMAL和NUMERIC值以二进制格式存储。”另外,我相信INT(10)映射到BIGINT,即8字节。 - Unreason
@Unreason 谢谢 - 回答已修改。我阅读了文档的多个部分,并且版本有些混乱。我也更清楚地解释了INT(10)和BIGINT的用法。 - Jarod Elliott
但是 intsmallint 等都是可变长度的,不是吗?如果是这样的话,哪个性能更好呢? - oldboy

5
根据mysql数据 存储要求,你的DECIMAL将需要:
DECIMAL(10,0):9位数字需要4个字节,剩下的第十个数字需要1个字节,因此总共需要5个字节(假设我正确阅读了文档)。
INT(10):需要 BIGINT,大小为8个字节。
区别在于DECIMAL是紧缩的,对这种数据类型的某些操作可能比直接映射到机器表示数字的正常INT类型慢。
但是,我建议您进行自己的测试以确认上述推理。
编辑: 我注意到我没有详细说明一个明显的观点 - 假设上述逻辑是正确的,那么所需的空间大小差异为BIGINT变体所需空间的60%。
然而,由于数据通常不是逐字节写入的,这并不直接转化为惩罚。在选择/更新多行的情况下,您应该看到性能损失/增益,但在选择/更新少量行的情况下,文件系统将从磁盘(S)提取块,通常会获取/编写多个列。索引的大小(和速度)可能更直接受到影响。
然而,如何打包影响各种操作的问题仍然存在。

1

0
我怀疑这样的差异与性能关系不大。 大部分的性能问题都与适当的数据库设计和索引方案有关,以及作为下一级别的服务器/硬件调优。

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