一、选择原则

1、越小越好
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。例如只需要存 0~200或者一些枚举类型,最好使用tinyint。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。
2、简单就好
能用整型的尽量不用字符串类型,简单数据类型的操作通常需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较 比 整型比较更复杂。这里有两个例子:一个是应该使用 MySQL 内建的类型(date, time, datatime)而不是字符串来存储日期和时间,另一个是应该用无符号整型存储 IP 地址。
3、尽量避免NULL
通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值。如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更复杂。特别是计划在列上建索引,就应该尽量避免设计成可为 NULL 的列。

二、常用的字段类型的选择说明

1、数值类型

类型存储(字节)存储(位)有符号范围无符号范围使用场景
tinyint18-128 ~1270~255枚举类
smallint216-32768~327670~65535使用较少
mediumint324-8388608~83886070~16777215使用较少
int432-2147483648~21474836470~4294967295数据量比较大的主表ID
bigint864-263~263-10~2^64-1数据量特别大的主表ID

2、字符串类型

会处理尾部空格:如果存储数据末尾包含空格,则会删除末尾空格

类型最大存储字符特点说明查询速度使用场景
char(m)255定常类型不够m个长度就在尾部补上空格,凑齐m个长度。会处理尾部空格最快适合用在身份证号码、手机号码等
varchar(m)65535变长类型不用补全空格,m建议越小越好,长度够用即可。不处理尾部空格次之用于存储可变长字符串,是最常见的字符串数据类型
text65535文本类型不用加默认值,有排序规则和字符集。不处理尾部空格最慢存储文章内容,新闻内容等
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+2m 的范围是165,d 的范围是030,而且d不能大于m定点类型(精确值)整数位和小数位分开存储,精度更高。在不指定精度时,默认整数为10,小数为0要求精确度很多,一般用于存储财务数据

4、时间类型

类型存储(字节)存储(位)存储格式支持范围使用场景
date324yyyy-mm-dd1000-01-01至9999-12-31通常用于保存用户生日
time324hh-mm-ss-838:59:59至838:59:59只需要记录时分秒的字段
datetime864yyyy-mm-dd hh-mm-ss1000-01-01 00:00:00至9999-12-31 23:59:59精确到时分秒,用于操作时间记录
year18yyyy1901至2155只需要记录年限的字段
timestamp432时间戳,从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字段等,可以省去代码层设置,当有数据更新,数据库就会根据当前时间修改此字段
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐