1 字段数据类型选择
1.1 各数据类型占用的字节数
TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字节 BIGINT 8 个字节 FLOAT(X) 4 如果 X < = 24 或 8 如果 25 < =X < = 53 FLOAT 4 个字节 DOUBLE 8 个字节 DOUBLE PRECISION 8 个字节 REAL 8 个字节 DECIMAL(M,D) M字节(D+2 , 如果M <D) NUMERIC(M,D) M字节(D+2 , 如果M <D)
日期和时间类型 列类型 需要的存储量 DATE 3 个字节 DATETIME 8 个字节 TIMESTAMP 4 个字节 TIME 3 个字节 YEAR 1 字节
串类型 列类型 需要的存储量CHAR(M) M字节,1 <= M <=255 VARCHAR(M) L+1 字节, 在此L <= M和1 <= M<= 255 TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8 BLOB, TEXT L+2 字节, 在此L< 2 ^ 16 MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24 LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32 ENUM('value1','value2',...) 1 或 2 个字节, 取决于枚举值的数目(最大值65535) SET('value1','value2',...) 1,2,3,4或8个字节,取决于集合成员的数量(最多64个成员)
其中,需要特别注意的是由于timestamp类型占用四个字节,因此只能存储到2037年
1.2 char和varchar抉择原则
原则一:数据长度差不多一致选择char,如身份证号,否则varchar;
原则二:数据长度最大不超过50bytes,选择char(如果列很少用,那么基于空间和io考虑,则应该采用varchar);
原则三:一般不宜定义超过50bytes的char类型字段;
1.3 decimal和float抉择原则
原则一:decimal存储精确数据;
原则二:float存储非精确数据(存储空间开销小);
1.4 时间类型存储
1.4.1 int存储
优点:只有四个字节,字段长度比datetime小;
缺点:由于只有四个字节,只能储存到2038年;
2 数据库设计的其他原则
2.1 尽量避免使用外键
原因:
一、降低数据导入的效率;
二、增加维护成本;
三、虽然不建议使用外键,但是相关联的列一定要加上索引;
2.2 避免使用触发器
原因:
一、降低数据导入的效率;
二、可能出现意想不到的数据异常;
三、使业务逻辑变得复杂
2.3 严禁使用预留字段
原因:
一、数据类型不明确;
二、不知道需要存储的内容,名称不明确,使用时需要更名;
三、第二点的更名造成的维护成本和添加字段成本相等。
2.4 反范式化设计
原因:使用空间换时间,如数据冗余
2.5 建立索引的原则
原则一:出现在where从句,group by从句、order by从句的列;
原则二:可选择性高的列要放在索引前面;
原则三:索引中不要包括太长的数据;
3 数据中适合的操作
3.1 批量操作优于逐条操作;
3.2 禁用select * 这样的查询;
3.3 控制使用用户自定义函数;
3.4 不要使用数据库中的全文索引;
4 垂直拆分
原则一:经常查询的列放在一起;
原则二:text、blob放到附加表;