字段类型的设计和选择
1.单表字段不宜过多
建议最多30个以内
字段越多,会导致性能下降,并且增加开发难度
2.使用小而简单的合适数据类型
a.字符串类型
固定长度使用char,非定长使用varchar,并分配合适且足够的空间
char在查询时,会把末尾的空格去掉
b.小数类型
一般情况可以使用float或double,占用空间小,但存储可能会损失精度
decimal可存储精确小数,存储财务数据或经度要求高时使用decimal
c.时间日期
通常尽量使用timestamp,因为它占用空间小,并且会自动进行时区转换,无需关心地区时差
datetime和timestamp只能存储最小颗粒度是秒,可以使用BIGINT类型存储微秒级别的时间戳
d.大数据 blob和text
blob和text是为存储很大的数据的而设计的字符串数据类型,但通常建议避免使用
MySQL会把每个blob和text当做独立的对象处理,存储引擎存储时会做特殊处理,当值太大,InnoDB使用专门的外部存储区域进行存储,行内存储指针,然后在外部存储实际的值。这些都会导致严重的性能开销
blob是二进制字符串,text是非二进制字符串,两者均可存放大量的信息。Blob主要存储图片、音频信息等,而text只能存储纯文本文件。
3.尽量将列设置为NOT NULL
a.可为NULL的列被索引时,占用更多的存储空间,一般,把可为NULL的列改为NOT NULL带来的提升比较少。
b.可为NULL的列,在使用索引和值比较时,MySQL需要做特殊的处理,损耗一定的性能,更难优化
建议:通常最好指定列为NOT NULL,除非真的需要存储NULL值
4.尽量使用整型做主键
a.整数型通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT
b.应该避免使用字符串类型作为标识列,因为它们很消耗空间,并且通常比数字类型慢
c.对于完全"随机"的字符串也需要多加注意。例如:MD5(),SHAI()或者UUID()产生的字符串。这些函数生成的新值也任意分布在很大空间内,这会导致INSERT和一些SELECT语句很缓慢