一、选择优化的数据类型

1.1 优化规则

1.1.1 更小的通常更好

一般情况下,应该尽可能使用正确的存储数据的最小数据类型,更小的数据类型通常更快,因为他们占用更少的磁盘、内存、和CPU缓存,并且处理时需要的CPU周期也更少。

1.1.2 简单就好

简单数据类型的操作通常需要更少的CPU周期,比如整型比字符操作代价更低。

1.1.3 尽量避免Null

通常情况下最好指定列为Not NuLL 除非真的需要存储NULL值,查询包含Null的列,对MySQL来说更难优化。

1.2 整型类型

整数类型 存储空间
tinyint 8
smallint 16
mediumint 24
int 32
bitint 64

他们存储的值范围的值可以从-2(n-1平方)到2(n-1平方)-1,其中N是存储空间位数。
整型类型有可选UNSIGNED属性,表示不允许负值,大致可以提升正数上限提高一倍,例如tinyint UNSIGNED可以存储的范围是0~255。

1.3 实数类型

实数是带有小数部分的数字,然而他们不只是为了存储小数部分,也可以使用decimal存储比bigint更大的整数。
Float和double都是浮点运算进行近似计算,浮点类型在存储同样的范围的值时,通常比decimal使用更少的空间。float使用4个字节,double存储8个字节。MySQL使用double作为内部浮点计算的类型。需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal。
例如财务数据,在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据最小的位数乘以相应的倍数即可。

1.4 字符串类型

Varchar

varchar类型用于存储可变长字符串,是最常见的字符串数据类型,他比定长类型更节省空间,因为他仅使用必要的空间(例如,越短的的字符串使用越少的空间)。
Varchar需要使用1或者2个额外字节记录字符串的长度;如果列的最长长度小于或者等于255,则使用1个字节,否则使用2个字节。

Char

char是类型是定长的,mysql总是根据定义的字符串长度来分配足够的空间。char值会根据需要采用空格进行填充比较方便。char适合存储很短的字符串,或者所有值都接近同一个长度。例如CHAR非常适合存储密码的MD5值。

使用VARCHAR(5)和VARCHAR(200)存储’hello’的空间开销是一样的,那么使用短的列有什么优势。事实证明有很大优势。更长的列会消耗更多的内存,因为MYSQ通常会分配固定大小的内存块来保存内部值。尤其是使用内存来存储临时表进行排序或者操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。 最好的策略是只分配真正需要的空间。

1.5 时间类型

Mysql提供2种类似的时间类型Datetime和Timestamp

Datetime

这个类型能保存大范围的值,从1001年到9999年,精度为秒,他把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字符的存储空间。

Timestamp

timestamp只使用4个字节存储空间,因此他的范围比datetime小很多,只能表示从1970到2038年。timestamp显示值依赖于时区。除了特殊行为之外,通常也应该尽量使用timestamp.