mysql+uuid的数据类型_mysql字段数据类型选择

选择优化的数据类型

MySQL支持的数据类型很是多, 选择正确的数据类型对于得到高性能相当重要。缓存

更小的一般更好函数

更小的数据类型一般更快, 由于它们占用更少的磁盘、 内存和CPU缓存, 而且处理时须要的CPU周期也更少。工具

简单就好性能

简单数据类型的操做一般须要更少的CPU周期。 例如, 整型比字符操做代价更低, 由于字符集和校对规则(排序规则 )使字符比较比整型比较更复杂。优化

尽可能避免NULL命令行

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

固然也有例外, 例如InnoDB 使用单独的位 (bit) 存储NULL值, 因此对于稀疏数据有很好的空间效率。设计

1.整数类型

有两种类型的数字:整数 (whole number) 和实数 (real number) 。 若是存储整数, 可使用这几种整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT。分别使用8,16, 24, 32, 64位存储空间。对象

整数类型有可选的 UNSIGNED 属性,表示不容许负值,这大体可使正数的上限提升一倍。 例如 TINYINT. UNSIGNED 能够存储的范围是 0 - 255, 而 TINYINT 的存储范围是 -128 -127 。排序

有符号和无符号类型使用相同的存储空间,并具备相同的性能 , 所以能够根据实际状况选择合适的类型。索引

你的选择决定 MySQL 是怎么在内存和磁盘中保存数据的。 然而, 整数计算通常使用64 位的 BIGINT 整数, 即便在 32 位环境也是如此。( 一些聚合函数是例外, 它们使用DECIMAL 或 DOUBLE 进行计算)。

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

2.实数类型

实数是带有小数部分的数字。 然而, 它们不仅是为了存储小数部分,也可使用DECIMAL 存储比 BIGINT 还大的整数。

FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。

DECIMAL类型用于存储精确的小数。

浮点和DECIMAL类型均可以指定精度。 对于DECIMAL列, 能够指定小数点先后所容许的最大位数。这会影响列的空间消耗。

有多种方法能够指定浮点列所须要的精度, 这会使得MySQL选择不一样的数据类型,或者在存储时对值进行取舍。 这些精度定义是非标准的,因此咱们建议只指定数据类型,不指定精度。

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

由于须要额外的空间和计算开销,因此应该尽可能只在对小数进行精确计算时才使用DECIMAL。但在数据最比较大的时候, 能够考虑使用BIGINT代替DECIMAL, 将须要存储的货币单位根据小数的位数乘以相应的倍数便可。

3.字符串类型

VARCHAR

用于存储可变⻓字符串,长度支持到65535

须要使用1或2个额外字节记录字符串的长度

适合:字符串的最大⻓度比平均⻓度⼤不少;更新不多

CHAR

定⻓,⻓度范围是1~255

适合:存储很短的字符串,或者全部值接近同一个长度;常常变动

慷慨是不明智的

使用VARCHAR(5)和VARCHAR(200)存储'hello'的空间开销是同样的。 那么使用更短的列有什么优点吗?

事实证实有很大的优点。 更长的列会消耗更多的内存, 由于MySQL一般会分配固定大小的内存块来保存内部值。 尤为是使用内存临时表进行排序或操做时会特别糟糕。 在利用磁盘临时表进行排序时也一样糟糕。

因此最好的策略是只分配真正须要的空间。

4.BLOB和TEXT类型

BLOB和 TEXT都是为存储很大的数据而设计的字符串数据类型, 分别采用 二进制和字符方式存储 。

与其余类型不一样, MySQL把每一个BLOB和TEXT值看成一个独立的对象处理。 存储引擎在存储时一般会作特殊处理。 当BLOB和TEXT值太大时,InnoDB会使用专门的 “外部“存储区域来进行存储, 此时每一个值在行内须要1 - 4个字节存储 存储区域存储实际的值。

BLOB 和 TEXT 之间仅有的不一样是 BLOB 类型存储的是二进制数据, 没有排序规则或字符集, 而 TEXT类型有字符集和排序规则

5.日期和时间类型

大部分时间类型都没有替代品, 所以没有什么是最佳选择的问题。 惟一的问题是保存日期和时间的时候须要作什么。 MySQL提供两种类似的日期类型: DATE TIME和 TIMESTAMP。

可是目前咱们更建议存储时间戳的方式,所以该处再也不对 DATE TIME和 TIMESTAMP作过多说明。

5.其余类型

5.1选择标识符

在能够知足值的范围的需求, 井且预留将来增加空间的前提下, 应该选择最小的数据类型。

整数类型

整数一般是标识列最好的选择, 由于它们很快而且可使用AUTO_INCREMENT。

ENUM和SET类型

对于标识列来讲,EMUM和SET类型一般是一个糟糕的选择, 尽管对某些只包含固定状态或者类型的静态 ”定义表” 来讲多是没有问题的。ENUM和SET列适合存储固定信息, 例若有序的状态、 产品类型、 人的性别。

字符串类型

若是可能, 应该避免使用字符串类型做为标识列, 由于它们很消耗空间, 而且一般比数字类型慢。

对于彻底 “随机” 的字符串也须要多加注意, 例如 MDS() 、 SHAl() 或者 UUID() 产生的字符串。 这些函数生成的新值会任意分布在很大的空间内, 这会致使 INSERT 以及一些SELECT语句变得很慢。若是存储 UUID 值, 则应该移除 "-"符号。

5.2特殊类型数据

某些类型的数据井不直接与内置类型一致。 低千秒级精度的时间戳就是一个例子,另外一个例子是以个1Pv4地址,人们常用VARCHAR(15)列来存储IP地址,然而, 它们其实是32位无符号整数, 不是字符串。用小数点将地址分红四段的表示方法只是为了让人们阅读容易。因此应该用无符号整数存储IP地址。MySQL提供INET_ATON()和INET_NTOA()函数在这两种表示方法之间转换。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值