mysql百分⽐类型_MySQL的基本数据类型与数据类型优化1.选择优化的数据类型的标准
1)更⼩的通常更好。
⼀般情况下,应该尽量使⽤可以正确存储数据的最⼩数据类型。更⼩的数据类型通常更快,因为他们占⽤更少的磁盘、和CPU缓存,并且处理时需要的CPU周期也更少。
2)简单就好
简单数据类型的操作通常需要更少的CPU周期
3)尽量避免NULL
许多表都包含可为NULL(空值)的列,记事应⽤程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。通常情况下,最好制定列为NOT NULL,除⾮真的需要存储NULL。
2.基本的数据类型
1)整数类型
TINYINT(8位存储空间)、SMALLINT(16位存储空间)、MEDIUMINT(24位存储空间)、INT(32位存储空间)
、BIGINT(63位存储空间),对应的值的存储范围为-2N-1⾄2N-1-1,其中N是存储空间的位数。
整数类型有可选的UNSIGNED属性,表⽰不允许负值,这⼤致可以使证书的上限提⾼⼀倍。例如:TINYINT可以存储的范围是0~255,⽽TINYINT存储的范围是-128~127。 有符号和⽆符号类型使⽤相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。
你的选择决定了MySQL怎样在内存和磁盘中存储数据。然⽽整数据算⼀般使⽤64位的BIGINT整数,即使在32位的环境也是如此。⼀些聚合函数是例外,他们使⽤DECIMAL(DECIMAL不属于浮点数类型,可以在定义时划定整数部份以及⼩数部分的位数。使⽤精确⼩数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分⽐使⽤decimal(4,2)即可。存储数据范围是:-10^38~10^38-1 的固定精度和⼩数位的数字。⼀个decimal类型的数据占⽤了2~17个字节。)或者DOUBLE进⾏计算。
MySQL可以为整数类型指定宽度,例如:INT(11),但是这对⼤多数应⽤是没有意义的。他不会限制指的合法范围,只是规定了MySQL的⼀些交互⼯具(例如MySQL命令⾏客户端)⽤来显⽰字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。
2)实数类型
DECIMAL、FLOAT(4字节存储)、DOUBLE(8字节存储)
DECIMAL可以⽤来存储⽐BIGINT还⼤的整数。DECIMAL⽤来存储精确的⼩数。在MySQL5.0和更⾼版本,DECIMAL⽀持精确计算。MySQL以及更早的版本使⽤浮点运算实现DECIMAL的计算。这样会因为精度损失导致⼀些奇怪的结果。
因为CPU不⽀持DECIMAL直接运算,所以在MySQL5.0和更⾼版本中,Mysql服务器⾃⾝实现了DECIMAL的⾼精度计算。相对⽽
⾔,CPU直接⽀持原⽣浮点计算,所以浮点运算明显更快。
浮点和DECIMAL都可以指定精度。对于DECIMAL列,可以指定⼩数点前后所云寻得最⼤位数。这会影响列的空间消耗。MySQL5.0和更⾼版本将数字打包和保存到⼀个⼆进制字符串中(每四个字街存9个数字)。例如:DECIMAL(18,9)⼩数点左右两边都将存储9个数字,共九个字节:⼩数点前数字⽤四个字节,⼩数点后数字⽤四个字节,⼩数点本⾝⼀个字节。
在MySQL5.0和更⾼版本中,DECIMAL最多允许65个数字,⽽早期的版本中是254个数字,并且保存为未压缩的字符串(每个数字⼀个字节)。然⽽并不能在计算中使⽤这么⼤的数字,因为DECIMAL只是⼀种存储格式,在计算中会转化为DOUBLE类型。
3)字符串类型
varchar(变长)、char(定长)、binary、varbinary、blob(⼆进制⽅式存储)、text(字符串⽅式存储)
varchar类型⽤于存储变长字符串,他必定长更节省空间,因为他仅使⽤必要的空间。有⼀种情况例外,如果MySql表使⽤
ROW_FORMAT=FIXED创建的话,每⼀⾏都会使⽤定长的存储,这会很浪费空间。
varchar需要使⽤⼀个或者两个额外的字节记录字符串的长度:如果列的最⼤长度⼩于或等于255字节,则使⽤⼀个字节表⽰。否则使⽤两个字节。
varchar节省了空间,所以对性能也有帮助。但是,由于⾏是变长的,在UPDATE时,可能使⾏变得⽐原来更长,这就需要做额外的⼯作。不同存储引擎处理不同。
有如下⼏个适合使⽤varchar的情景:
字符串列的最⼤长度⽐平均长度⼤很多;
列的更新很少,所以碎⽚不是问题。
使⽤了像UTF-8这样复杂的字符集,每个字符都是⽤不同的字节数进⾏存储。
char的类型是定长的,当存储CHAR值时,MySql会删除末尾所有的空格。(在MySql4.1和更⽼的版本中,varchar也是这样实现。也就是说,在这些版本中,char和varchar在逻辑上是⼀样的,区别只是在存储格式上)。char值会根据需要采⽤空格进⾏填充以⽅便⽐较。
适合使⽤char的情景:
char适合存储很短的字符串,或者所有的值都接近⼀个长度。
对于经常变更的数据,char也⽐varchar更好,因为char不容易产⽣碎⽚。
对于⾮常短的咧,char⽐varchar在存储空间上也更有效率。varchar需要额外字节存储长度。
与char和varchar类似的还有binary和varbinary,他们存储的是⼆进制字符串。⼆进制字符串与常规字符串类似,但是⼆进制字符串存储的是字节码,⽽不是字符。填充也不⼀样:MySql填充binary采⽤的是\0(零字节),⽽不是空格。在检索是也不会去掉填充值。
blob和text都是为了存储很⼤的数据类型⽽设计的字符串数据类型。实际上,他们份数量组不同的数据类型家族:字符类型是TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT,对应的⼆进制类型是TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB。BLOB是SMALLBLOB的同义词,TEXT是SMALLTEXT的同义词。
MySql会把每个BLOB和TEXT当做⼀个独⽴的对象处理。存储引擎在存储时,通常会做特殊处理。BLOB和TEXT家族之间仅有的不同是:BLOB类型存储的是⼆进制数据,没有排序规则或者字符集,⽽TEXT类型有字符集和排序规则。
4)⽇期和时间类型
mysql下载32位DATETIME、TIMESTAMP
MySql能存储的最⼩时间粒度为秒(MariaDB⽀持微妙级别的时间类型)。但是MySql可以使⽤微秒级的粒度进⾏临时运算。
DATETIME,精度秒,8字节存储空间,范围1001年~9999年,值与时区⽆关。
TIMESTAMP,显⽰的值依赖于时区,4字节存储空间,存储范围1970年~2038年,插⼊时未指定值,则默认为当前时间。MySql提供FROM_UNIXTOME()将UNIX时间戳转化为⽇期, UNIX_TIMESTAMP()将⽇期转化为UNIX时间戳。
除了特殊⾏为之外,应该尽可能使⽤TIMESTAMP类型,因为它⽐DATETIME空间效率更⾼。有时候会将UNIX时间戳存储为整数值,这不会带来任何收益。⽤整数存储时间戳的格式通常不⽅便处理。
如果要存储⽐秒更⼩的粒度,可以使⽤BIGINT存储微秒级别的时间戳,或者使⽤DOUBLE存储秒之后的⼩数部分。也可以使⽤MariaDB代替MySql。
5)特殊数据类型
某些类型的数据并不直接与内置的类型⼀致。地狱喵机精度的时间戳就是⼀个例⼦。另⼀个例⼦是IPv4地址,经常使⽤varchar(15)来存储IP地址,然⽽,它实际上是32位⽆符号整数,不是字符串。⼩数点讲地址分成四段的表⽰⽅法只是为了让⼈们容易阅读。所以应该使⽤⽆符号整数来存储IP地址。MySql提供了INET_ATON()和INET_NTOA()函数在这两种表⽰⽅法之间进⾏转换。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论