《高性能MySQL》MYSQL整数类型和实数类型

作者: JONE 分类: PHPer 发布时间: 2018-09-12 17:46

整数类型

有两种整数类型的数字:整数和实数。如果存储证书,可以使用这几种整数类型:TINYINT、 SMALLINT、 MEDIUMINT、 INT、 BIGINT 。分别使用8,16,24,32,64位储存空间。它们可以存储的值的范围从-2ⁿ¯¹到2ⁿ¯¹,其中 n 是储存空间的位数。

整数类型有可选的UNSIGNED属性,表示不允许负数值,这大致可以是正数的上限提高一倍。例如TINYINT UNSIGNED 可以是存储的范围是0~255,而TINYINT的储存范围是-128 ~ 127。

有符号和无符号类型使用相同的储存空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。

整数计算一般使用64为的BIGINT整数,即使在32位环境也是如此。(一些聚合函数是例外,他们使用DECIMAL或DOUBLE进行计算)。

MySQL可以为整数类型指定宽度,例如INT(11),对大多数应用来说这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用户显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。

实数类型

实数是带有小数部分的数字。然而它们不只是为了存储小数部分,也可以使用DECIMAL存储比BIGINT还大的整数。MySQL即支持精确类型也支持不精确类型。

FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。如果需要知道浮点运算是怎么计算的,则需要研究所使用的平台的浮点数的具体实现。

DECIMAL类型用于存储精确的小数。在MySQL5.0以及更高版本,DECIMAL类型支持精确计算。在MySQL4.1以及更早版本则使用浮点运算来实现DECIMAL的计算,这样做会因为精度损失导致一些奇怪的结果。在这些版本的MySQL中,DECIMAL只是一个“存储类型”。

因为CPU不支持DECIMAL的直接计算,所以在MySQL5.0以及更高版本中,MqSQL服务器自身实现了DECIMAL的高精度计算。相对而言,CPU直接支持原生浮点计算,所以浮点运算明显更快。

浮点和DECIMAL类型都可以指定精读。对于DECIMAL列,可以指定小数点前后所允许的最大位数。则会影响列的空间消耗。MySQL5.0和更高版本将数字打包存到一个二进制字符串中(每4个字节9个数字)。例如,DECIMAL(18,9)小数点两边将各存储9个数字,一个使用9个直接:小数点前的数字4个直接,小数点后的数字用4个字节,小数点本身占用1个字节。

浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个直接存储。DOUBLE占用8个直接,相比FLOAT有更高的精度和更大的范围。和整数一样能选择的只是存储类型,MySQL使用DOUBLE作为内部浮点计算的类型。

因为需要额外的空间计算开销,所以尽量只在对小数进行精确计算时才使用DECIMAL–例如存储财务数据。但是数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据销售的位数诚意相应的倍数即可。假设要存储财务数据精确到万分之一分,则可以吧所有金额乘以一百万,然后将结果存储在BIGINT里,这样可以同时避免浮点存储技术不景气和DECIMAL精确计算代价高的问题。