设计MySql必定须要注意的几点?

2021年11月26日 阅读数:3
这篇文章主要向大家介绍设计MySql必定须要注意的几点?,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本文讲解下我在实际开发中,对于mysql 设计所注意的几点,也有我认为你们不太留意的点。mysql

不使用enum

首先说一下优势,能够控制插入字符的选项,规范数据。那说说有哪些缺点,以下:sql

  • 不方便扩展:后期若是增长选项,若是不是插入到最后,那 enum 的索引就会调整
  • 保存要注意:若是存储数字字符串时,必定要带引号,若是不带,会视为索引

总结:若是你的内容是固定的,后期不会增长,那能够选择 enum ,例如:男、女。那若是是状态类的,后期会根据业务增长新状态,那就使用 tinyint(1) 。数据库

不使用外键

这是一个把约束最终交给数据库仍是程序的问题,我在这说说个人几点见解。性能

  1. 性能:没有了外键约束,那天然性能会提升
  2. 可读性:有外键约束,增长 ER 图的可读性,方便查看表之间的关系。
  3. 完整性:有外键约束,能够在数据库层面控制数据的完整性,不会形成一个表有数据,一个表没有。但若是我进行数据的部分保全,那使用外键就是个约束。

说了这几点后, 天然也明白了我不选择使用外键的缘由。学习

不存储NULL值

当保存字符串数据是空的时候,每每有两种选择,空字符串或NULL。那如何选择呢,我这里先给出建议,选择空字符串(默认空字符串),缘由以下:spa

  1. 空值不占空间,NULL值占空间。当字段不为NULL时,也能够插入空值。
  2. 当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为 NULL 的或者为 NULL 的,不能查出空值。
  3. 在进行 count() 统计某列的记录数的时候,若是采用的NULL值,系统会自动忽略掉,可是空值是会进行统计到其中的。

TIMESTAMP和DATETIME

  1. 存储方式设计

    对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。code

    而对于DATETIME,不作任何改变,基本上是原样输入和输出。blog

  2. 范围排序

  • DATETIME 时间截至到 9999-12-31 23:59:59
  • TIMESTAMP 时间截止到 2038-1-19 11:14:07

3. 自动填充时间

mysql5.6 以前 TIMESTAMP 支持以下语法,5.6以后 DATETIME 才支持。

-- 建立时自动填充当前时间
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- 建立和修改时自动填充当前时间
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP,

4. 总结

若是不考虑时间的截至日期,我考虑选择 TIMESTAMP,由于能够兼容不一样版本的时间填充和时区控制。

字符集和排序规则

在建立数据库时,须要设定字符集和排序规则。

  1. 先说字符集,推荐使用 utf8mb4 ,这个包含目前全部的信息存储,例如:emoji表情、全部语言。

  2. 排序规则

  • utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用
  • utf8_general_cs 区分大小写,若是用户名和邮箱用这个 就会照成不良后果
  • utf8_bin 字符串每一个字符串用二进制数据编译存储。区分大小写,并且能够存二进制的内容

注意:通常选择 utf8_general_ci ,它在where 语句进行比对查询时,速度很快。

不使用bit类型

在设计表时,若是出现状态之类的字段。例如:0 表明男,1 表明女。使用 tinyint(1) 代替。缘由以下:

  1. 不能节省空间大小

    刚开始我从字面意思理解 bit(1) 只占用了 1 bit(位)(1字节等于8bit),那真实状况是什么,查看官网文档后发现,bit(M) 的存储空间大约是  (M+7)/8 字节,也就是说 bit(1) 存储的大小不是 1位,而是1 字节。

  2. 使用上的不便

    mysql中的二进制类型,存储数据时使用 B'1111100' 或 b'1111100' ,读取数据时使用bin(column_name)

少用text类型

查询速度: char > varchar > text

  • 存储的数据长度固定,选择 char 类型
  • 不固定的话使用 varchar,避免使用 text,若是 varchar 长度不够时能够增长长度,而在业务方面内容长度最好获得规范和控制

以上只是列举了几点,但在实际开发中数据库相关的知识点太多太多。就先学习这几点,若是你还有其它补充的,请在下方留言。