mysql+uuid的数据类型_mysql字段数据类型选择
选择优化的数据类型
MySQL⽀持的数据类型很是多, 选择正确的数据类型对于得到⾼性能相当重要。缓存
更⼩的⼀般更好函数
更⼩的数据类型⼀般更快, 由于它们占⽤更少的磁盘、 内存和CPU缓存, ⽽且处理时须要的CPU周期也更少。⼯具
简单就好性能
简单数据类型的操做⼀般须要更少的CPU周期。 例如, 整型⽐字符操做代价更低, 由于字符集和校对规则(排序规则 )使字符⽐较⽐整型⽐较更复杂。优化
尽可能避免NULL命令⾏
若是查询中包含可为NULL 的列, 对MySQL来讲更难优化, 由于可为NULL 的列使得索引、 索引统计和值⽐较都更复杂。 可为NULL的列会使⽤更多的存储空间, 在MySQL⾥也须要特殊处理。 当可为NU
LL的列被索引时, 每⼀个索引记录须要⼀个额外的字节, 在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个字节存储。DOU
BLE占⽤8个字节,相⽐FLOAT有更⾼的精度和更⼤的范围。和整数类型同样, 能选择的只是存储类型; MySQL使⽤DOUBLE做为内部浮点计算的类型。
由于须要额外的空间和计算开销,因此应该尽可能只在对⼩数进⾏精确计算时才使⽤DECIMAL。但在数据最⽐较⼤的时候, 能够考虑使⽤BIGINT代替DECIMAL, 将须要存储的货币单位根据⼩数的位数乘以相应的倍数便可。
3.字符串类型
VARCHAR
⽤于存储可变⻓字符串,长度⽀持到65535
mysql下载32位须要使⽤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()函数在这两种表⽰⽅法之间转换。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论