MySQL表字段数据类型设计建议

MySQL表字段数据类型设计建议


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux...等等,会持续更新

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

阿里巴巴Mysql字段类型规范

在MySQL中,选择正确的数据类型,对于性能至关重要。一般应该遵循下面两步:

  • 1)确定合适的大类型:数字、字符串、时间、二进制;
  • 2)确定具体的类型:有无符号、取值范围、变长定长等。

在MySQL数据类型设置方面,尽量用更小的数据类型,因为它们通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOT NULL,避免使用NULL。

一、数值类型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128, 127) (0, 255) 小整数值
SMALLINT 2 字节 (-32 768, 32 767) (0, 65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608, 8 388 607) (0, 16 777 215) 大整数值
INT或INTEGER 4 字节 (-2^ 31 , 2^31 - 1) (0, 2^32 - 1) 大整数值
BIGINT 8 字节 (-2^ 63 , 2^63 - 1) (0, 2^64 - 1) 极大整数值
FLOAT 4 字节 单精度,浮点数值
DOUBLE 8 字节 双精度,浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

优化建议:

  • 1、如果整形数据没有负数,如ID号,建议指定为UNSIGNED无符号类型,容量可以扩大一倍。
  • 2、建议使用TINYINT代替ENUM、BITENUM、SET。
  • 3、避免使用整数的显示宽度(参看文档最后),也就是说,不要用INT(10)类似的方法指定字段显示宽度,直接用INT。
  • 4、DECIMAL最适合保存准确度要求高,而且用于计算的数据,比如价格,但是要注意长度设置。
  • 5、建议使用整形类型来运算和存储实数,方法是,实数乘以相应的倍数后再操作。
  • 6、整数通常是最佳的数据类型,因为它速度快,并且能使用AUTO_INCREMENT。

INT显示宽度

我们经常会使用命令来创建数据表,而且同时会指定一个长度,但是,这里的长度并非是TINYINT类型存储的最大长度,而是显示的最大长度,如下:

sql 复制代码
CREATE TABLE `user`(
   `age` TINYINT(2) UNSIGNED...
);

这里表示user表的age字段的类型是TINYINT,可以存储的最大数值是255。

所以,在存储数据时,如果存入值小于等于255,如200,虽然超过2位,但是没有超出TINYINT类型长度,所以可以正常保存;

如果存入值大于255,如500,那么MySQL会自动保存为TINYINT类型的最大值255。

在查询数据时,不管查询结果为何值,都按实际输出。这里TINYINT(2)中2的作用就是,当需要在查询结果前填充0时,命令中加上ZEROFILL就可以实现,如下:

sql 复制代码
CREATE TABLE `user`(
   `age` TINYINT(2) UNSIGNED ZEROFILL...
);

这样,查询结果如果是5,那输出就是05。如果指定TINYINT(5),那输出就是00005,其实实际存储的值还是5,而且存储的数据不会超过255,只是MySQL输出数据时在前面填充了0。

换句话说,在MySQL命令中,字段的类型长度TINYINT(2)、INT(11)不会影响数据的插入,只会在使用ZEROFILL时有用,让查询结果前填充0。

二、日期和时间类型

类型 大小 范围 格式 用途
DATE 3 字节 1000-01-01 到 9999-12-31 YYYY-MM-DD 日期值
TIME 3 字节 '-838:59:59' 到 '838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 字节 1901 到 2155 YYYY 年份值
DATETIME 8 字节 1000-01-01 00:00:00 到 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 字节 1970-01-01 00:00:00 到 2038-01-19 03:14:07 YYYYMMDDhhmmss 混合日期和时间值,时间戳

优化建议:

  • 1、MySQL能存储的最小时间粒度为秒。
  • 2、建议用DATE数据类型来保存日期。MySQL中默认的日期格式是yyyy-mm-dd。
  • 3、用MySQL的内建类型DATE、TIME、DATETIME来存储时间,而不是使用字符串。
  • 4、当数据格式为TIMESTAMP和DATETIME时,可以用CURRENT_TIMESTAMP作为默认(MySQL5.6以后),MySQL会自动返回记录插入的确切时间。
  • 5、TIMESTAMP是UTC时间戳,与时区相关。
  • 6、DATETIME的存储格式是一个YYYYMMDD HH:MM:SS的整数,与时区无关,你存了什么,读出来就是什么。
  • 7、除非有特殊需求,一般的公司建议使用TIMESTAMP,它比DATETIME更节约空间,但是像阿里这样的公司一般会用DATETIME,因为不用考虑TIMESTAMP将来的时间上限问题。
  • 8、有时人们把Unix的时间戳保存为整数值,但是这通常没有任何好处,这种格式处理起来不太方便,我们并不推荐它。

三、字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串,char(n)当插入的字符串实际长度不足n时,插入空格进行补充保存。在进行检索时,尾部的空格会被去掉。
VARCHAR 0-65535 字节 变长字符串,varchar(n)中的n代表最大列长度,插入的字符串实际长度不足n时不会补充空格
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

优化建议:

  • 1、字符串的长度相差较大用VARCHAR;字符串短,且所有值都接近一个长度用CHAR。
  • 2、CHAR和VARCHAR适用于包括人名、邮政编码、电话号码和不超过255个字符长度的任意字母数字组合。
    那些要用来计算的数字不要用VARCHAR类型保存,因为可能会导致一些与计算相关的问题。换句话说,可能影响到计算的准确性和完整性。
  • 3、尽量少用BLOB和TEXT,如果实在要用可以考虑将BLOB和TEXT字段单独存一张表,用id关联。
  • 4、BLOB系列存储二进制字符串,与字符集无关。
  • 5、TEXT系列存储非二进制字符串,与字符集相关。
  • 6、 BLOB和TEXT都不能有默认值。

四、IP存储

  • 1、在MySQL中,当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串,用UNSIGNED INT类型存储IP 地址是一个4字节长的整数。
  • 2、IP地址数据采用整数(UNSIGNED INT)存储,在存储和CPU资源使用上都少于字符串存储形式;在歧义较大的范围查询中,存储整数方式无需关系范围中的位数问题,查询更加直观方便。
  • 3、但整数存储需要使用INET_ATON()、INET_NTOA()等特定函数处理,可读性查。
  • 4、因此,需要范围查询,且数据量很大(如亿级以上),采用数值存储IP地址的方式更好。如果均是唯一IP精确查询,或数据量不大,那么使用字符串操作更为简单。

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

相关推荐
一 乐1 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
鹏码纵横1 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
美林数据Tempodata3 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐3 小时前
node.js连接mysql写接口(一)
数据库·mysql
Zzzone6834 小时前
PostgreSQL日常维护
数据库·postgresql
chxii4 小时前
1.13使用 Node.js 操作 SQLite
数据库·sqlite·node.js
冰刀画的圈4 小时前
修改Oracle编码
数据库·oracle
这个胖子不太裤4 小时前
Django(自用)
数据库·django·sqlite
麻辣清汤4 小时前
MySQL 索引类型及其必要性与优点
数据库·mysql
2501_915374355 小时前
Neo4j 图数据库安装教程(2024最新版)—— Windows / Linux / macOS 全平台指南
数据库·windows·neo4j