前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 8.0 如何创建一张规范的表

MySQL 8.0 如何创建一张规范的表

作者头像
数据库交流
发布2022-06-15 13:58:33
3.3K0
发布2022-06-15 13:58:33
举报
文章被收录于专栏:悦专栏悦专栏

这一节内容,基于 MySQL8.0 版本,聊一下如何创建一张规范的表。

首先贴出一张相对规范的表结构:

代码语言:javascript
复制
CREATE TABLE student_info (
`id` INT  NOT NULL AUTO_INCREMENT COMMENT '主键',
`stu_name` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '姓名',
`stu_class` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '班级',
`stu_num` INT NOT NULL DEFAULT '0' COMMENT '学号',
`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '总分',
`tuition` DECIMAL(5, 2) NOT NULL DEFAULT '0' COMMENT '学费',
`phone_number` VARCHAR(20) NOT NULL DEFAULT '0' COMMENT '电话号码',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',
PRIMARY KEY (`id`),
UNIQUE KEY uniq_stu_num (`stu_num`),
KEY idx_stu_score (`stu_score`),
KEY idx_update_time_tuition (`update_time`, `tuition`)
) ENGINE = INNODB charset = utf8mb4 COMMENT '学生信息表';

这里对上面设置的原因进行解释:

1 表、字段全采用小写。

防止因为大小写问题找不到表或者弄错表。

2 int 类型不再加上最大显示宽度,也就是不适用类似int(11) 的形式。

具体原因可复习:MySQL 5.7 和 8.0 几处细节上的差异

3 每张表必须显式定义主键,可用自增 int 类型或者有序 UUID。

如果 InnoDB 表没有显式定义主键,则可能会选择唯一索引做为主键,但是唯一索引很可能不是递增的,写入数据时,很可能会导致数据页频繁分裂,从而导致写入效率低和页空间浪费。这也是选择自增 int 类型或者有序 UUID 做为主键的原因。

4 增加 comment 来描述字段和表的含义。比如:status TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效'。

方便其他人知道字段的含义,并且不加 comment,可能过一段时间自己都忘记字段作用是什么了。跟写代码加注释一个意思。

5 通常建议包含 create_time 和 update_time 字段,即表必须包含记录创建时间和修改时间的字段。

方便知道记录什么时候创建,什么时候更新的,分析问题的时候很方便。如果有数据归档,也可以根据这两个字段进行归档处理。

6 核心业务表增加记录标记字段。

如上表的 status 字段,写入记录时,默认记录为 1,表示记录有效,如果记录用不到,则把 status 更新成 0,避免物理删除,增加数据安全性。

7 用尽量少的存储空间来存储一个字段的数据:

  • 能用 int 的就不用 char 或者 varchar;
  • 能用 tinyint 的就不用 int;
  • 使用 UNSIGNED 存储非负数值;
  • 只存储年使用 YEAR 类型;
  • 只存储日期使用 DATE 类型。

8 存储精确浮点数必须使用 DECIMAL 替代 FLOAT 和 DOUBLE。

在存储的时候,FLOAT 和 DOUBLE 都存在精度损失的问题,很可能在比较值的时候,得不到正确的结果。

9 尽可能不使用 TEXT、BLOB 类型。

会浪费更多的磁盘和内存空间,非必要的大量大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能。如果实在有某个字段过长需要使用 TEXT、BLOB 类型,则建议独立出来一张表,用主键来对应,避免影响原表的查询效率。

10 经常做为条件、排序、关联的字段增加索引。

加快查询速度,降低锁等待时间。

11 具有唯一性的字段,添加成唯一索引,比如上面的 stu_num 字段。

万一业务没完全解决唯一性,那数据库还有一层唯一性保证。

12 几个字段同时作为条件的概率很高时,或者方便查询能走覆盖索引,可以考虑创建联合索引。

走覆盖索引,避免回表,提高查询速度。

13 字符集使用 utf8mb4,无乱码风险;与 utf8 编码相比,utf8mb4 能支持 Emoji 表情。

utf8 的升级版,建议 8.0 都采用这个字符集。

14 存储引擎使用 InnoDB。

99% 的情况使用 InnoDB 就对了。

15 单表字段数目建议小于 30;

字段数太多影响性能,并且不好维护。

大概想到的就是这些,当然,创建一张规范的表,还需要结合线上的环境,比如是否有分库分表、是否会经常归档历史数据等

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 悦专栏 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档