一、选择原则
1、越小越好:
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。例如只需要存 0~200或者一些枚举类型,最好使用tinyint。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。
2、简单就好:
能用整型的尽量不用字符串类型,简单数据类型的操作通常需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较 比 整型比较更复杂。这里有两个例子:一个是应该使用 MySQL 内建的类型(date, time, datatime)而不是字符串来存储日期和时间,另一个是应该用无符号整型存储 IP 地址。
3、尽量避免NULL:
通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值。如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更复杂。特别是计划在列上建索引,就应该尽量避免设计成可为 NULL 的列。
二、常用的字段类型的选择说明
1、数值类型
类型 | 存储(字节) | 存储(位) | 有符号范围 | 无符号范围 | 使用场景 |
---|---|---|---|---|---|
tinyint | 1 | 8 | -128 ~127 | 0~255 | 枚举类 |
smallint | 2 | 16 | -32768~32767 | 0~65535 | 使用较少 |
mediumint | 3 | 24 | -8388608~8388607 | 0~16777215 | 使用较少 |
int | 4 | 32 | -2147483648~2147483647 | 0~4294967295 | 数据量比较大的主表ID |
bigint | 8 | 64 | -263~263-1 | 0~2^64-1 | 数据量特别大的主表ID |
2、字符串类型
会处理尾部空格:如果存储数据末尾包含空格,则会删除末尾空格
类型 | 最大存储字符 | 特点 | 说明 | 查询速度 | 使用场景 |
---|---|---|---|---|---|
char(m) | 255 | 定常类型 | 不够m个长度就在尾部补上空格,凑齐m个长度。会处理尾部空格 | 最快 | 适合用在身份证号码、手机号码等 |
varchar(m) | 65535 | 变长类型 | 不用补全空格,m建议越小越好,长度够用即可。不处理尾部空格 | 次之 | 用于存储可变长字符串,是最常见的字符串数据类型 |
text | 65535 | 文本类型 | 不用加默认值,有排序规则和字符集。不处理尾部空格 | 最慢 | 存储文章内容,新闻内容等 |
blob | - | 二进制类型 | 没有排序规则或字符集 | - | 存储图像/音频等二进制信息 |
3、浮点类型
m代表总位数,d代表小数点右边的位数。m和d又称为精度和标度
类型 | 存储(字节) | 精确度 | 特点 | 说明 | 使用场景 |
---|---|---|---|---|---|
float(m,d) | 4 | 小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位 | 单精度浮点类型(近似值) | 整数位和小数位一起存储。在不指定精度时。默认会按照实际的精度来显示 | 需要小数部分并且对精度的要求不高时 |
double(m,d) | 8 | 小数部分能精确到小数点后的15位,加上小数点前的一位 有效位数为16位 | 双精度浮点类型(近似值) | 整数位和小数位一起存储。在不指定精度时。默认会按照实际的精度来显示 | 高速数学计算、科学计算、卫星定位计算等处理器上双精度型实际上比单精度的快, 所以: 当你需要保持多次反复迭代的计算精确性时,或在操作值很大的数字时,双精度型是最好的选择。 |
decimal(m,d) | 将数字打包保存到二进制字符串(每 4 个字节存 9 个数字)如果m>d,为m+2否则为d+2 | m 的范围是165,d 的范围是030,而且d不能大于m | 定点类型(精确值) | 整数位和小数位分开存储,精度更高。在不指定精度时,默认整数为10,小数为0 | 要求精确度很多,一般用于存储财务数据 |
4、时间类型
类型 | 存储(字节) | 存储(位) | 存储格式 | 支持范围 | 使用场景 |
---|---|---|---|---|---|
date | 3 | 24 | yyyy-mm-dd | 1000-01-01至9999-12-31 | 通常用于保存用户生日 |
time | 3 | 24 | hh-mm-ss | -838:59:59至838:59:59 | 只需要记录时分秒的字段 |
datetime | 8 | 64 | yyyy-mm-dd hh-mm-ss | 1000-01-01 00:00:00至9999-12-31 23:59:59 | 精确到时分秒,用于操作时间记录 |
year | 1 | 8 | yyyy | 1901至2155 | 只需要记录年限的字段 |
timestamp | 4 | 32 | 时间戳,从1970-01-01 00:00:00到当前的时间差值 | 1970-01-01 00:00:00 到 2037年 | 除了特殊行为之外,通常也应该尽量使用 |
三、默认值设置原则
1、字符串类型
建议默认设置Empty String,尽量不要设置NULL
原因:空值(’’)是不占用空间的,MySQL中的NULL其实是占用空间的
另外:从开发角度考虑,如果字段为空,默认NULL,接口没有做非空判断直接输出NULL,前端会直接展示NULL,这是不友好的
2、数值类型
如果有特殊情况,根据特殊情况定义,否则建议默认给 0
3、时间类型
可以根据需要设置当前时间,一般用于createTime字段等,可以省去代码层设置,数据库直接记录当前数据插入时间
并且可以勾选根据当前时间戳更新,一般用于updateTime字段等,可以省去代码层设置,当有数据更新,数据库就会根据当前时间修改此字段