数据库设计原则:
a,更小的通常更好。
应该尽量使用可以正确存储数据的最小数据类型。如只要存储0-200,tinyint unsigned更好
b,简单就好
简单的数据类型的操作需要更少的cpu周期。同时后期优化也更为容易。
c,尽量避免使用null
mysql在建立索引,优化过程对null需要做特殊处理,耗费额外资源。非特殊情况,避免使用null。
数据类型常识
一,整数类型
根据存储空间:
TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT | |
存储空间位数n | 8 | 16 | 24 | 32 | 64? |
存储范围 | -128~127 |
根据属性
unsigned:-2(N-1)-2(N-1)-1 --没办法输入右上标
signed:0~2(N-1)
指定宽度
INT(11),这对大多数应用没有实际意义,他不会限制值的合法范围,只是规定了一些交互工具用来显示字符的个数,对存储和计算来说,INT(11)和INT(20)是相同的
二:实数类型
float,double,decimal
float和double使用标准浮点近似运算.
decimal使用精确运算.需要额外开销,
decimal(18,9),存储18位数,小数点左右各9位。
三,字符串类型
长度 | 额外记录长度 | 长度不足 | 长度超出 | 尾部空格 | |||||
varchar(n) | 变长 | 需要 | 以实际长度存储 | 截断 | 保留 | ||||
char(n) | 定长 | 不需要 | 尾部用空格填充 | 截断 | 删除 |
varchar:字符串最大长度比平均长度大很多,列更新很少,碎片不是问题
char:char会根据需要对存储数据尾部空格删除,如果长度不足,采用空格对尾部填充,
适合存储很短,或者所有值都接近同一个长度
四,日期和时间类型
datetime,timestamp
datetime:它把日期和时间封装成YYYYMMDDHHMMSS的整数中,可排序,无奇异,可表示范围到9999年
timestamp,保存从1970-01-01午夜以来的秒数,具备自动刷新功能,和时区绑定,效率更高,可表示范围到2038年。
五,大文本类型
blog,text,这种数据我一直认为应该以文本形式存储在系统文件中比较好
六,ENUM
有限类型字符串,用枚举的方式代替,效率更高。
数据类型不外乎是mysql用来存储数据的格式规范,mysql由c++开发,其实自己用c++定义一套数据库亦可,只是mysql更成熟稳定罢了。