使用十进制数据类型是否有性能损失(MySQL/Postgres)

wob*_*col 21 mysql database postgresql types type-conversion

我理解整数和浮点数据类型是如何存储的,我猜测十进制数据类型的可变长度意味着它更像是一个字符串存储.

当使用十进制数据类型并搜索它们时,这是否意味着性能开销?

Cra*_*ger 24

帕维尔说得很对,我只想解释一下.

假设您的意思是与浮点或定点偏移整数(即将千分之一的整数存储为整数)相比对性能产生影响:是的,会产生很大的性能影响.PostgreSQL,以及MySQL的声音,存储DECIMAL/ NUMERIC二进制编码的十进制.这种格式比将数字存储为文本更紧凑,但使用起来效率仍然不高.

如果您没有在数据库中进行多次计算,则影响仅限于BCD与整数或浮点相比需要的更大存储空间,因此更宽的行和更慢的扫描,更大的索引等等.b中的比较操作-tree索引搜索速度也较慢,但不足以解决问题,除非由于某些其他原因您已经受到CPU限制.

如果您使用数据库中的DECIMAL/ NUMERIC值进行大量计算,那么性能确实会受到影响.这一点尤其引人注目,至少在PostgreSQL中,因为Pg不能为任何给定的查询使用多个CPU.如果你在数字上进行大量的除法和乘法,更复杂的数学,聚合等,你可以开始发现自己在使用浮点数或整数数据类型时永远不会遇到CPU限制.这在OLAP类(分析)工作负载以及加载或提取(ETL)期间的报告或数据转换中尤为明显.

尽管有一个性能的影响(其变化的基础上,从可忽略不计,以相当大的工作量),你通常应该使用numeric/ decimal时,它是最合适的类型,你的任务-即在非常高的范围值必须存储和/或倒圆错误是不可接受的.

偶尔使用bigint和定点偏移量是值得的,但这是笨拙且不灵活的.由于使用货币等浮点值可靠地工作的所有挑战,使用浮点代替很少是正确的答案.

(顺便说一句,我很高兴一些新的Intel CPU和IBM的Power 7系列CPU包括对IEEE 754十进制浮点的硬件支持.如果这在低端CPU中可用,它将是数据库的巨大胜利.)


Pav*_*ule 9

十进制类型(Postgres中的数字类型)的影响取决于使用情况.对于典型的OLTP,这种影响不会很大 - 因为OLAP可能相对较高.在我们的应用程序中,使用numeric对大型列进行聚合比使用double double类型慢多了.

尽管当前的CPU很强大,但仍然是规则 - 只有在需要精确数字或非常高的数字时才应使用数字.在其他地方使用浮点或双精度类型.