目录

一 自增主键 id

二 创建时间、更新时间

三 字段添加索引

四 数据逻辑删除

五 灵活运用数据库编码

六 添加 version 字段

七 COLLATE 区分字符大小写


本文主要总结工作这些年来,一些建表的较好的实践经验,希望能给你一点点启发或者帮助。

一 自增主键 id

为什么需要自增主键id?

性能、存储空间两个角度考虑:

性能:自增主键在新增记录的时候属于顺序写,磁盘的数据页利用率高,不会触发数据页分裂;与业务相关的字段做主键,容易触发随机写,为了维护索引的有序性,需要移动索引树页子节点,容易引发数据页分裂。

存储空间:自增主键的长度一般要比业务主键要小,而非主键索引的叶子节点上存储的都是主键的值,显然,主键长度越小,非主键索引的叶子节点就越小,非主键索引占用的空间也就越小。

因此,从性能和存储空间两个角度来考虑,自增主键是合理的。

事无绝对,是否可以在建表的时候不创建id?

你还真别说,我还真就遇到过,我们当初这块有一个学生关注老师表,该表就没有主键id,学生id和老师id作为联合主键id,说实话给学生关注老师表添加自增主键id,该字段也没啥业务含义。

如果说创建自增主键id没有业务含义,且能接受文件写入一定的性能影响,我觉得不加自增id也是可以的。

二 创建时间、更新时间

为什么需要添加创建时间、更新时间呢?

有了创建时间和更新时间,对于数据统计、数据追踪有很大的意义;其中更新时间天然就是一个版本的概念,便于乐观锁的实现。

创建时间、更新时间取哪里的时间呢?WEB 服务器时间?DB 服务器时间?

建议取 WEB 服务器时间(Tomcat,Jboss,Apache),不建议取 DB 服务器时间。还真别说,我就遇到过 DB 服务器时间错乱,导致线上数据错误的问题。都是血淋淋的教训。

三 字段添加索引

为什么需要索引?

索引的目的是为了减少查询次数,提高查询效率。可以充分的运用覆盖索引、最左前缀原则、唯一索引等对查询进行优化。

四 数据逻辑删除

什么是数据逻辑删除?

所谓的逻辑删除,就是给数据打上删除标签。

为什么不建议进行物理删除?

因为一旦进行物理删除之后,数据就没了,将来查问题、对数据进行追溯都不方便。再说了,我们是有原则的人,从删库到跑路的事情,我们坚决不干

五 灵活运用数据库编码

如果说表需要存储 emoji 等特殊字符,可以使用 utf8mb4 编码,不需要建议使用 utf8 编码。

六 添加 version 字段

version 字段是给表添加的版本字段,每次对表进行更新,version 字段也进行更新。version 字段是用来实现乐观锁的。

七 COLLATE 区分字符大小写

查看 COLLATE 支持那些类型?

mysql 中执行 show collation 命令。

COLLATE 有哪些常用类型?

utf8mb4_general_ci(默认)、utf8mb4_unicode_ciutf8mb4_bin这三个。

  • utf8mb4_bin 就是直接将所有字符看作二进制串,然后从最高位往最低位比对。是区分大小写的。
  • utf8mb4_general_ci 和 utf8mb4_unicode_ci 是以 ci(Case Insensitive)结尾,不区分大小写

注意 !!!

如果业务开发中字母需要区分大小写 COLLATE 类型用 utf8mb4_bin,如果不需要 COLLATE 使用 utf8mb4_general_ci 和 utf8mb4_unicode_ci 都行。

mysql 建表最佳实践相关推荐

  1. MySQL 索引的最佳实践分享

    作者爱说话 忙忙碌碌的一周又过去了,这周最大的乐趣就是买了个小音箱,又可以下班的时候开始愉快的开始练琴了,程序员嘛,还是得培养点艺术细菌.哈哈 这周本来没想好写什么东西,刚好周五公司进行了内部技术分享 ...

  2. mysql建表2个索引是啥意思_Mysql建表与索引使用规范详解

    本篇文章是对Mysql建表和索引使用规范进行了详细的分析介绍,需要的朋友参考下 一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默 ...

  3. Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

    在学习 Python3 爬虫关系型数据库储存时,利用 pymysql 连接 MySQL 建表,测试用的代码如下,第一句 SQL 用于获取当前 MySQL 的版本信息,第二句 SQL 执行创建 spid ...

  4. mysql 建表时建立索引_mysql 分享建表和索引的几点规范

    一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...

  5. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  6. 总结MySQL建表、查询优化实用小技巧

    MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...

  7. mysql建表测试_总结MySQL建表、查询优化实用小技巧

    MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...

  8. MySQL建表(那些字段必须)命令详解

    MySQL建表(那些字段必须)命令详解1. create table命令 强调:使用建表命令之前必须使用use命令选择表所在的数据库.create table命令的格式如下: create table ...

  9. MySql 建表出现的问题:[ERR] 1064 - You have an error in your SQL syntax; check the manual..........

    使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 建表语句: DROP DATABASE IF EXISTS javawe ...

最新文章

  1. ORACLE EXP命令
  2. 设置google浏览器不缓存JS
  3. Jupyter 快速入门——写python项目博客非常有用!!!
  4. HDU 2567 寻梦(字符串,插入)
  5. 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
  6. C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
  7. Spark实战之读写HBase
  8. 母函数——找单词(hdu2082)
  9. 三部门部署开展非学科类校外培训收费专项整治工作
  10. 大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)...
  11. python移动平均算法_移动平均算法
  12. c# 代码混淆器ConfuserEX使用
  13. 实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎
  14. SPDK/NVMe存储技术分析之用户态ibv_post_send()源码分析(一)
  15. Linux的加密和安全
  16. 岛屿最大面积 leetcode Java_LeetCode刷题记录——岛屿的最大面积
  17. C#textbox和label显示皆透明如何修改/让字体和背景透明
  18. 什么是嵌入式?嵌入式技术应用领域
  19. Python3网络爬虫
  20. 基于JAVA线上动漫周边商城计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. 华为认证报考流程(详细步骤)-手把手教你注册华为账号,预约华为考试,下载华为证书
  2. RestTemplate上传微信临时素材
  3. prompt综述论文阅读:Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural La
  4. MyBatis实现中间表关联查询
  5. 怎么让Win10不显示快速访问记录
  6. 2013年度对话《3S 新闻周刊》
  7. 网站常用的favicon.ico文件
  8. 2021.02.17 GDKOI2021 好题记 第一记
  9. 如何评价文档图片的相似度
  10. 【Mskt问题的解决办法】使用御坂翻译器2.x版本遇到的常见问题及解决办法