mysql整型无符号 大小_MySQL 数据类型优化(一: 整型和实数类型) | 剑花烟雨江南...

良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往就要权衡很多因素。例如,反范式的设计可以加快某些类型的查询,但同时也可能使另一些类型的查询变慢。比如添加计数表和汇总表是一种很好的优化查询方式,但这些表的维护成本可能会很高。

选择优化的数据类型

MySQL的数据类型支持的非常多,选择正确的数据类型对于获得高性能至关重要。下面的几个原则有助于做出更好的选择。

更小的通常更好

一般情况下,应该尽量使用可以正确存储的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘、内存、CPU和缓存,并且处理时需要的CPU周期也更少。

简单就好

简单数据类型的操作通常需要更少的生命周期。例如,整型比字符串操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较更为复杂。

尽量避免NULL

很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性,通常情况下指定列为NOT NULL,除非真的要存储NULL值。

如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更为复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定大小的索引变成可变大小的索引。

在为列选择数据类型时,第一步需要确定合适的大类型:数字、字符串、时间等。这通常是简单的,但是我们会提到一些特殊的不是那么直观的案例。

下一步是选择具体的类型。很多MySQL的数据类型可以存储相同类型的数据,只是存储的长度和范围不一样、允许的精度不同,或者需要的物理空间不同,相同大类型的不同子类型数据有时也有一些特殊的行为和属性。

例如,DATETIME 和 TIMESTAMP 列都可以存储相同类型的数据:时间和日期,精确到秒。然而 TIMESTAMP 只使用 DATETIME 一半的存储空间,并且会根据时区变化,具有特殊的自动更新能力。另一方面,TIMESTAMP 允许的时间范围小很多,有时候它的特殊能力会成为障碍。

一、整数类型

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

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

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

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

二、实数类型

实数是带有小数部分的数字,然而,他们不只是为了存储小数部分;也可以使用DECIMAL 存储比 BIGINT 更大的整数。FLOAT 和 DOUBLE 类型支持使用标准的浮点运算进行近似计算。

浮点和 DECIMAL 类型都可以指定精度。对于DECIMAL 列,可以指定小数点前后所允许的最大位数,这会影响列的空间消耗。例如: DECIMAL(10,2) 则表示小数点前将保存8个字节,小数点后保存2个字节:小数点前的数字用7个字节,小数点后的数字用2个字节,小数点本身占1个字节。

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

因为需要额外的空间和计算开销,所以应尽量只在对小数进行精确计算时才使用DECIMAL —— 例如财务数据。但在数据量比较大的时候,可以考虑使用BIGINT 代替 DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可,这样可以避免浮点存储计算不精确和DECIMAL 精确计算代价高的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值