4.1 选择优化的数据类型
原则:
- 能够正确存储数据的最小数据类型:占用更少的磁盘、内存和CPU缓存
- 简单的数据类型:CPU处理更快
- 尽量避免null:null值是列的默认属性。可为null值的列占用更多的存储空间,对索引不友好。
整数类型
整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别使用8、16、24、32、64位存储空间。整数类型有UNSIGNED属性,表示非负。MySQL可以为整数类型指定宽度,例如 int(11),它仅用来控制客户端工具显示字符的个数,而并非限制值的合法范围。从存储与计算来说int(1)与int(11)是一样的。
实数类型
实数类型:实数是带有小数部分的数字,它(decimal)可用来表达比BIGINT更大的整数。实数类型又可细分为浮点型和定点型。MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度
浮点型:float、double为浮点数类型,float使用四个字节存储,double使用八个字节存储,所以又把float称为单精度浮点数,double为双精度浮点数。double显然比float拥有更高的精度与更大的范围。相同的是,它们的存储和都是近似值。
定点型:decimal ,它用于存储精确的小数。decimal通常占用更多的空间,以此来实现更高的精度与更大的范围。因为需要额外的空间和计算开销,所以应该避免使用
注意,列值的数据类型只是决定了MySQL以何种方式将数据保存在磁盘中。也就是说能选则的只是存储类型,计算方式则有MySQL自己决定。一般地,MySQL使用64位的BIGINT整数来进行整数运算,即使在32位环境中亦是如此;使用double作为内部浮点计算;对于一些聚合函数则可能使用decimal或double进行计算。
字符串类型
字符串列可以定义自己的字符集和排序规则,或者说校对规则(collation),这些属性很大程度上影响性能。
varchar:用于存储可变长字符串。varchar使用1或2个额外字节来记录字符串的长度。如果列的最大长度小于或等于255,则只使用1个字节来记录长度,否则使用2个字节。varchar列在更新时,可能会碰上页内无足够空间存储的情况,如果是myisam存储引擎,它会将该行拆成不同的片段存储;如果是innodb则需要分裂页来使行可以放进页内。
char:用于存储定长或者所有值都很接近同一长度的字符串。比如MD5值。
注意,字符串长度定义不是字节数,是字符数,多字节字符集可能会用多个字节来存储单个字符。
blob和text都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。当blob和text值太大时,innodb会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值。MySQL对blob和text列进行排序与其他类型是不同的,它只对每个列的最前max_sort_length字节而不是整个字符串做排序,这是因为它们存的值很大。如果只需要针对前面一小部分排序,则可以减小max_sort_length的配置,或者使用order by sustring(column,length).mysql_不能将blob和text列全部长度进行索引,也不能使用这些索引消除排序。应该尽量避免使用blob和text
由于blob是二进制存储,那么它就没有排序规则或字符集。而text有字符集和排序规则。
枚举类型
枚举可以把一些不重复的字符串存储成一个预定义的集合。MySQL在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的“查找表”。