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

165次阅读
没有评论

整数类型

有两种整数类型的数字:整数和实数。如果存储证书,可以使用这几种整数类型: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 精确计算代价高的问题。

正文完
有偿技术支持加微信
post-qrcode
 
评论(没有评论)
验证码