选择优化的数据类型
- 更小数据类型的更好
- 简单数据类型
- 尽量避免NULL
特别在列上建索引的时候。当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里会导致固定大小的索引变成可变大小的索引。
用0,某特殊值,“”替代 - 使用尽可能短的列
整数类型
学会使用UNSIGNED属性,正数上限扩大一倍
实数类型
不精确类型,DOUBLE,CPU支持原生浮点运算,计算更快
精确类型,DECIMAL,例如财务数据。
在数据量比较大的时候,考虑使用bigint,把所有金额*一百万,然后用bigint存储,可以同时避免浮点运算不精确和DECIMAL计算代价高的问题。
字符串类型
变长字符串,VARCHAR;
更节省空间,仅仅使用必要的空间。但再UPDATE的时候,行变长之后,页内没有足够空间存储,InnoDB就需要分裂页,导致额外工作
合适:字符串的长度有的特别长,比平均长度大很多,列的更新很少。
定长字符串,CHAR;
适合存储很短的字符串,或者长度基本相同的。对于经常变更的数据,由于是定长的,不容易产生碎片。
存储很大数据的字符串类型(不推荐)
BLOB,二进制方式存储;没有排序规则或字符集
TEXT,字符串方式存储,有排序规则和字符集
查询使用BLOB和TEXT会使用MyISAM磁盘临时表,效率低,尽量避免。是在避免不了,将BLOB列值转换为字符串,用内存临时表。
使用枚举(ENUM)代替字符串
在存储枚举时,可以让表变小。
MySQL把每个枚举值转换成整数。
适合存储固定信息,性别,产品类型
日期
TIMESTAMP(推荐),4字节,更小,尽量使用它
DATETIME,8字节
范式,反范式
范式,把大表拆成小表
优点
- 更新快
- 没有重复数据,修改更少
- 表小,更好放内存,快
缺点
- 单独的表,需要更多关联
反范式,避免关联
缓存表和汇总表
//to do