一、表的优化与列类型选择
表的优化:
1、定长与变长的分离
2、常用字段与不常用字段分离
3、在一对多,需要关联统计的字段上添加冗余字段
列类型选择:
1、字段类型优先级: 整型 > date, time > enum, char > varchar > blob, text
其列的特点分析:
整型:定长没有国家、地域之分,没有字符集的差异
比如:int 1,2,3,4,5 <-> char(1) a,b,c,d,e
从空间上都是占1个字节,但是 order by 排序,前者快;这是由于后者需要考虑字符集与校对集(就是排序规则)
date/time:直接选 int unsgined not null 存储时间戳
time:定长,运算快,节省空间,考虑时区写 sql 时不方便
enum:能起来约束值的目的,内部用整型来存储,但与 char 联查时,内部要经历串与值的转化
char:定长,考虑字符集和(排序)校对集
varchar:不定长,考虑字符集的转换与排序时的校对集,速度慢
text/Blob:无法使用内存临时表(排序等操作只能在磁盘上进行)
2、够用就行,不要太慷慨:大的字段浪费内存,影响速度
3、尽量避免用 null():null 不利于索引,要用特殊的字节来标注
它在磁盘上占据空间其实更大(MySQL5.5之后进行优化,其大小区别已不明显了)
Eunm 列的说明:
①、内部是整型来存储的
②、enum 列与 enum 列相关联速度快
③、enum 列比 (var)char 的弱势,再碰到与 char/varchar 关联时要转化,花费时间
④、当 char 非常长时,enum 依然是固定长度,当查询数量越大时,enum 的优势越明显
⑤、enum 与 char/varchar 关联,由于转化,速度要比 enum -> enum、char -> char 要慢,但是当数据量特别大时,可以节省IO