高性能MySQL-第四章Schema与数据类型优化

1、选择优化的数据类型

一、整数类型
有两种类型的数字:整数(whole number)和实数(real number)。如果存储整数,可以使用这几种整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分别使用8、16、24、32、64位存储空间。
整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍。有符号和无符号类型使用相同的存储空间,并具有相同的性能。
二、实数类型
实数是带有小数部分的数字。然而,它们不只是为了存储小数部分;也可以使用DECIMAL存储比BIGINT还大的整数。
MySQL既支持精确类型,也支持不精确类型。
FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似运算。
DECIMAL类型用于存储精确的小数。
浮点和DECIMAL类型都可以指定精度。对于DECIMAL列,可以指定小数点前后所允许的最大位数。这会影响列的空间消耗。
浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储。DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围。
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL,但是在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL。
三、字符串类型
VARCHAR和CHAR类型
VARCHAR和CHAR是两种最主要的字符串类型。。VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅使用必要的空间。CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
存储Y和N和值,CHAR(1)单字节字符集只需要一个字节,但是VARCHAR(1)需要两个字节,因为还有一个记录长度的额外字节。
BLOB和TEXT类型
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
实际上,它们分别属于两组不同的数据类型家族:字符类型是TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT;对应的二进制类型是TINYLBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB。BLOB是SMALLBLOB的同义词,TEXT是SAMLLTEXT的同义词。
与其他类型不同,MySQL把每个BLOB和TEXT值当作一个独立的对象处理。
BLOB和TEXT家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则。
使用枚举(ENUM)代替字符串类型
四、日期和时间类型
MySQL提供两种相似的日期类型:DATETIME和TIMESTAMP。
DATETIME:这个类型能保存大范围的值,从1001到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
TIMESTAMP:只使用4个字节的存储空间,范围比DATETIME小的多:只能表示从1970年到2038年。
五、位数据类型
MySQL有少数几种存储类型使用紧凑的位存储数据。所有这些位类型,不管底层存储格式和处理方式如何,从技术上来说都是字符串类型。
BIT:可以使用BIT列在一列中存储一个或多个true/false值。BIT(1)定义一个包含单个位的字段,BIT(2)存储2个位,以此类推。BIT列的最大长度是64个位。
SET:如果需要保存很多true/false值,可以考虑合并这些列到一个SET数据类型,它在MySQL内部是以一系列打包的位的集合来表示的。
在整数列上进行按位操作:一种替代SET的方式是使用一个整数包装一系列的位。
六、选择标识符(identifier)
为标识列(identifier column)选择合适的数据类型非常重要。
整数类型:整数通常是标识列最好的选择。
ENUM和SET类型:适合存储固定信息。
字符串类型:避免使用字符串类型作为标识列。
2、范式和反范式
在范式化的数据库中,每个事实数据会出现并且只出现一次。相反,在反范式化的数据库中,信息是冗余的,可能会存储在多个地方。
 
原文地址:https://www.cnblogs.com/zhishuiyushi/p/12318700.html