MySQL表设计优化与索引 (三)

Real Numbers

实数

实数是具有小数部分的数字, 当然, 实数不是专门用来表示小数的, 也可以用DECIMAL来存储那些无法用INTERGER来存储的大整数。 Mysql同时支持准确的和非准确的类型。

FLOAT和DOUBLE类型支持近似的标准浮点数数学计算。 如果需要知道准确的浮点数计算, 参考具体平台的浮点数计算规则。

DECIMAL类型是用来存储准确的小数, 在mysql 5.0以后的版本, DECIMAL支持准确的数学计算。在Mysql4.1 及以前的版本中, MUMERIC类型也是用浮点计算来完成运算的, 因此可能会出现一些由于精度损失而出现的一些不准确的结果, 在这些版本的mysql中, DECIMAL是一种”存储”概念类型。

在5.0以及以后的版本, mysql自己来进行DECIMAl计算, 因为cpu没有对DECIMAL的直接支持。 当然, 浮点计算在某种程度上相对快些, 因为CPU是直接支持浮点计算的。

浮点类型和DECIMAl类型允许指定精度。对于DECIMAL字段, 能够指定小数点前和后允许的最多的数字个数, 这个关系到数值的存储空间的消耗。Mysql5.0以及以后的版本中, 所有的数字位数以二进制字符串的方尺存储的(每4个字节9个数字)。 例如, DECIMAL(18, 9) 数据类型的小数点两边都存储9个数字符号, 因此共用9个字节, 4个字节存储小数点之前的数字符号, 1个字节存储小数点本身, 4个字节存储小数点之后的数字符号。

在MYSQL 5.0及之后的版本, 一个DECIMAL数字能存储65位数字, 早期的mysql版本有254位数字的限制, 并把数字打包存储成字符串(每个数字一个字节)。 在运算中, 这些版本的mysql一般不需要使用到这么多的空间, 因为DECIMAL只是表示存储格式, 在计算中是通过转换成DOUBLE类型的数字来进行的。有多种方式指定浮点类型字段需要的精确度, 这使得Mysql会悄悄的选择另外一种不同的数据类型或近似值来存储。 这些精确度修饰符不是标准的, 所以建议通过选择数据类型而不是精度。

一般情况下, 存储相同范围数值的浮点数类型比DECIMAL类型所使用的空间要小些; 1个FLOAT字段用4个字节的存储,DOUBLE用8个字节的来存储更高精度和更大范围的数值。 其实对于整数类型来说, INTERGER指定的其实是存储类型, mysql其实用的是DOUBLE来进行存储和内部计算的。 因为DECIMAL需要占更多的存储空间和需要更多的计算资源, 因此除非在一些需要准确计算结果的场合–比如存储财务数据外, 尽量不是使用。