高性能MySql阅读笔记第四章--Schema与数据类型优化阅读笔记
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素。
本章主要为接下来的索引优化与查询优化做铺垫,覆盖了MySql特有的schem设计方面的主题:
一.选择优化的数据类型
Mysql支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。在为列选择数据类型时,第一步需要确定合适的大类型,下一步是选择具体类型相同大类型下的不同子类型数据有时也有一些特殊的行为和属性。
1.更小的数据类型通常更好
2.简单就好
3.尽量避免NULL
二.整数类型
可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。
整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍。
整数计算一般使用64位的BIGINT整数,即使32位环境也是如此(一些聚合函数是例外,他们使用DECIMAL或DOUBLE进行计算)。
三.实数类型
FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。DECIMAL类型用于存储精确的小数,Mysql服务器自身实现了DECIMAL的高精度计算,相对而言,CPU直接支持原生浮点计算,所以浮点计算明显更快。
浮点和DECIMAL类型都可以指定精度,对于DECIMAL可以指定小数点前后所允许的最大位数,这会影响列的空间消耗。
浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间,所以应该尽量只在对小数进行精确计算时才使用。
四.字符串类型
VARCHAR和CHAR是两种最主要的字符串类型。
VARCHAR类型存储可变长字符串,他比定长类型更节省空间,VARCHAR节省了存储空间,所以对性能也有帮助,但由于是变长的,在UPDATE时可能使行变得比原来长,这就导致需要做额外的工作。
CHAR是定长的,适合存储很短的字符串(末尾会用空格填充)。
五.BLOB和TEXT类型
Mysql把每个BLOB和TEXT值当作一个独立的对象处理。
六.使用枚举(ENUM)代替字符串类型
有时候可以使用枚举代替常用的字符串类型,枚举把一些不重复的字符串存储成一个预定义的集合。枚举在保存时是(数字-字符串)的形式。
七.日期和时间类型
Mysql使用许多类型保存日期和时间值,例如year和date,Mysql能存储的最小时间粒度为秒,Mysql提供两种相似的日期类型:DATETIME和TIMESTAMP,在某些场合一个比另一个工作的更好。
DATETIME
这个类型保存的最大值从1001到9999年,精度为秒。
TIMESTAMP使用4个字节保持日期,默认NOT NULL。
八.位数据类型
BIT 最大长度64个位。Mysql把BIT当作字符串类型,而不是数字类型。
SET 一系列打包位的集合。Mysql有像FIND_IN_SET和FIELD这样的函数,方便在查询中使用。他的主要缺点是改变列的代价太高,也无法在SET上通过索引查找。
九.选择标识符。通常为整数类型和字符串。
十.特殊类型数据,例如毫秒级时间,IP地址,可以在使用时进行相应转换。