Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用十进制数据类型(MySQL/Postgres)是否会影响性能_Mysql_Database_Postgresql_Types_Type Conversion - Fatal编程技术网

使用十进制数据类型(MySQL/Postgres)是否会影响性能

使用十进制数据类型(MySQL/Postgres)是否会影响性能,mysql,database,postgresql,types,type-conversion,Mysql,Database,Postgresql,Types,Type Conversion,我理解整数和浮点数据类型是如何存储的,我猜十进制数据类型的可变长度意味着它更像字符串一样存储 当使用十进制数据类型并对其进行搜索时,这是否意味着性能开销 我猜十进制数据类型的可变长度意味着 存储起来更像一个字符串 取自MySql文档 文件说 从MySQL 5.0.3开始 十进制列的值不再表示为 每个数字或符号字符需要1字节。取而代之的是二进制格式 用于将9个十进制数字打包为4个字节。此更改为 十进制存储格式也会改变存储要求。这个 每个数据的整数部分和小数部分的存储要求 值是单独确定的。九位数的每

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

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

我猜十进制数据类型的可变长度意味着 存储起来更像一个字符串

取自MySql文档

文件说

从MySQL 5.0.3开始 十进制列的值不再表示为 每个数字或符号字符需要1字节。取而代之的是二进制格式 用于将9个十进制数字打包为4个字节。此更改为 十进制存储格式也会改变存储要求。这个 每个数据的整数部分和小数部分的存储要求 值是单独确定的。九位数的每一个倍数需要 4字节,任何剩余的数字都需要4字节的一部分


您是正确的:定点数据存储为()字符串

这对性能的影响程度取决于一系列因素,包括:

  • 查询是否在列上使用索引

  • CPU能否在硬件中执行BCD操作,例如通过

  • 操作系统线束硬件是否支持库功能

  • 总的来说,与您可能面临的其他因素相比,任何性能影响都可能是可以忽略的:所以不要担心。记住Knuth的格言,“过早优化是万恶之源”

    十进制类型(Postgres中的数字类型)的影响取决于使用情况。对于典型的OLTP,这种影响可能并不显著——对于OLAP,这种影响可能相对较高。在我们的应用程序中,使用numeric的大型列上的聚合比使用双精度类型的聚合要慢很多倍


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

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

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

    如果您没有在数据库中进行大量计算,则影响仅限于BCD与整数或浮点相比所需的更大存储空间,因此行更宽、扫描速度较慢、索引更大等。b树索引搜索中的比较操作也较慢,但这还不够重要,除非你已经因为其他原因限制了CPU

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

    尽管存在性能影响(根据工作负载从可忽略到相当大而有所不同),但在任务最合适的类型(即必须存储非常高的范围值和/或舍入误差不可接受)时,通常应使用
    数字
    /
    十进制

    有时,使用bigint和定点偏移是值得的,但这既笨拙又不灵活。使用浮点数来代替是非常罕见的正确答案,因为在货币等方面,要可靠地使用浮点数值存在诸多挑战


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

    为什么答案是
    ?从你引用的那句话中,我会说答案是非常
    是的
    @eggyal,怎么说?我不明白。它是可变长度的,所以它不会在一个CPU操作中执行,除非它是一个数字。我试图证明Postgres在一个任务中与MongoDB一样有能力,所以至少在某种程度上进行优化是有意义的。我们似乎为了某种原因而抛弃了很多关系上的优点,或者使用了一些时髦的技术堆栈。@wobbily\u col:如果是这样,请将您的同事发送到和@Denis,我想保留一个模式!其他人已经做了一些基准测试来证明MongoDB是唯一可行的方法,但是数据是关系型的,在我们有一些可靠的需求之前对其进行非规范化对我来说似乎是一个很大的错误。@wobbily\u col。。。MongoDB有一些神奇的超快速精确、高范围数字(BCD或IEEE 754十进制浮点)类型?或者你不是真的在比较同一件事吗?数据似乎是关系型的,但他们选择了Mongo、Node、Express等。已经做了一些基准测试,但我认为他们尝试的唯一关系型数据库是MySQL。只是永远不要使用浮动来换取金钱或货币,好吗?是的,我很清楚这一点。原因是大多数操作必须在CPU上进行,而不是在FPU上进行优化。如果您需要十进制精度进行存储,但不需要计算结果(即精确存储0.1和0.2,但很乐意使用0.1+0.2=0.300…003),一个解决方案是d