MySQL调优之数据类型
1.选择优化的数据类型
几个原则:更小的通常更好 简单就好 尽量避免NULL
选择数据类型时,先选合适的大类型:数字,字符串,时间等。下一步选择具体类型。
具体类型包括:
1.1 整数类型
如果存储整数,可以使用以下几种数据类型:
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT。分别使用8,16,24,32,64位存储空间。可选UNSIGNED属性。
1.2 实数类型
如果存储实数类型:FLOAT和DOUBLE支持使用标准浮点运算进行近似计算,而DECIMAL类型用于存储精确的小数。
浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储,而DOUBLE占用8个字节。由于开销,除非要对小数进行精确计算,否则不要用DECIMAL。
1.3 字符串类型
VARCHAR
VARCHAR用于存储可变长字符串,比CHAR更节省空间。VARCHAR使用1或2个额外字节记录字符串的长度。VARCHAR节省了存储空间,所以对性能也有帮助。
以下情况适合用VARCHAR:
1.字符串列的最大长度比平均长度大很多;
2.列的更新很少;
3.UTF-8字符集,每个字符用不同的字节数进行存储
CHAR
CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。
存CHAR值时,MySQL会删除所有的末尾空格。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
BINARY和VARBINARY存储的是二进制字符串。
BLOB和TEXT类型
为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
使用枚举(ENUM)代替字符串类型
可以让表的大小缩小,而且当把列都转换成ENUM以后,关联变得很快。
1.4 日期和时间类型
DATETIME
TIMESTAMP
通常尽量使用TIMESTAMP,因为它比DATETIME空间效率更高。
1.5 位数据类型
BIT
SET
在整数列上按位操作
1.6 选择标识符
整数类型
整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT。
ENUM和SET类型
避免
字符串类型
避免
2.MySQL schema 设计中的陷阱
太好的列
全能的枚举
3.范式和反范式