mysql 建表最佳实践
目录
一 自增主键 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_ci
、utf8mb4_bin
这三个。
utf8mb4_bin
就是直接将所有字符看作二进制串,然后从最高位往最低位比对。是区分大小写的。utf8mb4_general_ci 和 utf8mb4_unicode_ci 是以 ci(
Case Insensitive)结尾,不区分大小写
注意 !!!
如果业务开发中字母需要区分大小写
COLLATE 类型用utf8mb4_bin,如果不需要
COLLATE 使用utf8mb4_general_ci 和 utf8mb4_unicode_ci 都行。
mysql 建表最佳实践相关推荐
- MySQL 索引的最佳实践分享
作者爱说话 忙忙碌碌的一周又过去了,这周最大的乐趣就是买了个小音箱,又可以下班的时候开始愉快的开始练琴了,程序员嘛,还是得培养点艺术细菌.哈哈 这周本来没想好写什么东西,刚好周五公司进行了内部技术分享 ...
- mysql建表2个索引是啥意思_Mysql建表与索引使用规范详解
本篇文章是对Mysql建表和索引使用规范进行了详细的分析介绍,需要的朋友参考下 一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默 ...
- Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告
在学习 Python3 爬虫关系型数据库储存时,利用 pymysql 连接 MySQL 建表,测试用的代码如下,第一句 SQL 用于获取当前 MySQL 的版本信息,第二句 SQL 执行创建 spid ...
- mysql 建表时建立索引_mysql 分享建表和索引的几点规范
一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- 总结MySQL建表、查询优化实用小技巧
MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...
- mysql建表测试_总结MySQL建表、查询优化实用小技巧
MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...
- MySQL建表(那些字段必须)命令详解
MySQL建表(那些字段必须)命令详解1. create table命令 强调:使用建表命令之前必须使用use命令选择表所在的数据库.create table命令的格式如下: create table ...
- MySql 建表出现的问题:[ERR] 1064 - You have an error in your SQL syntax; check the manual..........
使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 建表语句: DROP DATABASE IF EXISTS javawe ...
最新文章
- ORACLE EXP命令
- 设置google浏览器不缓存JS
- Jupyter 快速入门——写python项目博客非常有用!!!
- HDU 2567 寻梦(字符串,插入)
- 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
- C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
- Spark实战之读写HBase
- 母函数——找单词(hdu2082)
- 三部门部署开展非学科类校外培训收费专项整治工作
- 大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)...
- python移动平均算法_移动平均算法
- c# 代码混淆器ConfuserEX使用
- 实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎
- SPDK/NVMe存储技术分析之用户态ibv_post_send()源码分析(一)
- Linux的加密和安全
- 岛屿最大面积 leetcode Java_LeetCode刷题记录——岛屿的最大面积
- C#textbox和label显示皆透明如何修改/让字体和背景透明
- 什么是嵌入式?嵌入式技术应用领域
- Python3网络爬虫
- 基于JAVA线上动漫周边商城计算机毕业设计源码+数据库+lw文档+系统+部署
热门文章
- 华为认证报考流程(详细步骤)-手把手教你注册华为账号,预约华为考试,下载华为证书
- RestTemplate上传微信临时素材
- prompt综述论文阅读:Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural La
- MyBatis实现中间表关联查询
- 怎么让Win10不显示快速访问记录
- 2013年度对话《3S 新闻周刊》
- 网站常用的favicon.ico文件
- 2021.02.17 GDKOI2021 好题记 第一记
- 如何评价文档图片的相似度
- 【Mskt问题的解决办法】使用御坂翻译器2.x版本遇到的常见问题及解决办法