1.主键设计

主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,且自增,最好设计为Long类型,对应MySQL的bigint

bigint详解: MySQL_bigint(20) 是什么意思? - 根号829 - 博客园

2.关于外键

尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过id进行关联,我们使用业务进行管理,否则每次删除或更新都会关联查询,性能差,可以把这个逻辑放在业务层里,避免额外的查询

3.动静分离

最好做好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存)。动态表:一些频繁修改的表

这样做的好处是当我根据主键查询所需的数据时,根据id到磁盘查找出这条数据即可,当作了动静分离后,这次取出的数据就是经常修改的那部分数据,而不经常修改的数据在另一个表中,物理上不相邻,这次用不到就不会被取出

4.资源存储

数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用

5.字段长度

建表的时候,字段长度尽量要比实际业务的字段大3-5个字段左右(考虑到合理性和伸缩性),最好是2的n次方幂值。不能建比实际业务太大的字段长度(比如订单id如果考虑要业务增长的话,一定要使用Long型,对应的数据库的数据类型是bigint),这是因为如果字段长度过大,在进行查询的时候索引在B-Tree树上遍历会越耗费时间,从而查询的时间会越久;但是绝对不能建小,否则mysql数据会报错,程序会抛出异常;

6.时间字段的选择

使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间

DATETIME

使用8字节存储,可以保存大范围的值,从1001~9999年

TIMESTAMP

使用4字节存储,保存范围比DATETIME小,从1970~2038年

TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高

超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储

经常会有人用字符串存储日期型的数据(不正确的做法)

•缺点 1:无法用日期函数进行计算和比较

•缺点 2:用字符串存储日期要占用更多的空间

7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型

相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销

8.字符类型的选择

尽可能使用varchar/nvarchar 代替 char/nchar

varchar(50)表示的是设置可以存储的最大字符串长度为50个字节,并且字符是变长的,如果不满50个就是根据实际存储的字节来确定的。

1>最大长度:

char最大长度是255字符,varchar最大长度是65535个字节。

2>定长:

char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。

3>空间使用:

char会浪费空间,varchar会更加节省空间。

4>查找效率:

char查找效率会很高,varchar查找效率会更低。

5>尾部空格:

char插入时可省略,vaechar插入时不会省略,查找时省略。

6>varchar(n)需要1到2个额外字节记录长度n的值

当n<=255的时候,只需要1个字节记录即可(数据表示范围:0 ~ (2^8-1),即0~255);当n>255的时候,则需要2个字节存储n的值((2^8)~ (2^16)-1,即256~65535)。

varchar字段报错的实际值得长度保存在第一个或者前两个字节中。
所以:
a.如果varchar(20),实际是需要1+20个字节的存储空间;
b.如果varchar(255),实际是需要1+255个字节的存储空间;
c.如果varchar(256),实际是需要2+256个字节的存储空间;
d.如果varchar(500),实际是需要2+500个字节的存储空间.

9.每种类型字段后面,指定长度如何指定

这个数字不是字节数,而是长度

mysql bigint(20)中20指的是:该字段下能输出显示的最大数字长度。

括号里的数字叫数据的宽度,不同的数据类型对宽度的处理也不一样:

1> 整数类型:这里显示的宽度和数据类型的取值范围是没有任何关系的,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;

如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。

如果你不设置宽度,系统将添加默认的宽度tinyint(4)、smallint(6)、mediumint(9)、int(11)、bigint(20),这些默认的宽度是跟该类型的取值范围长度相关。

2> 字符串类型:字符串类型这个宽度才真的用上了。不管是char还是varchar,宽度都定义了字符串的最大长度;例如上面的 password varchar(20),如果你输入了一个21个字符的密码,那么保存和显示的只会是前20个字符,你将丢失一个字符信息,char同理。由于varchar是变长存储的,所以实际开发中我们一般都把varchar的宽度设为最长255,它会根据实际数据长度变化,反正你没用完它也不会浪费空间。char是定长存储,定义多长就是多长。

3> 浮点和日期等数据类型:对数据的宽度没有要求,一般也不设置,默认是0

10.IP地址在MySQL中如何存

1>只存储ipv4 可以用一个int类型的字段来存储,MySQL也提供了用于将其转换成字符串的函数,但这个时候和IPv4无法兼容

MySQL中INET_ATON()、INET_NTOA函数_doublefay的专栏-CSDN博客_inet_aton

2>同时存储IPV6和IPV4还使用varchar吧

https://baike.baidu.com/item/IPv6/172297?fr=aladdin

11.浮点数的选择

MySQL如何选择float, double, decimal - 图生 - 博客园

CREATE TABLE test_order (id INT AUTO_INCREMENT PRIMARY KEY,description VARCHAR(255),cost DECIMAL(19,4) NOT NULL
);

12.尽量使用 not null

  在mysql数据库中,“NULL” 和 “空值(空字符串)”是不一样的。NULL是一种比较特殊的数据类型,这也可以解释为什么字段设置为NOT NULL,却可以插入空值。空值是不占用空间的,而NULL需要占用空间。

  在平常我们设计数据库时,如果是索引字段,一定要定义为 NOT NULL 。因为 NULL 值会影响优化器对索引的选择,索引效率会下降很多。虽然表中允许 NULL 列,但其他字段也尽量定义为 NOT NULL 。 mysql 在进行比较的时候,NULL 会参与字段比较。因为 NULL 是一种比较特殊的数据类型。数据库在处理的时候需要进行特殊的处理。如此的话,就会增加数据库处理记录的复杂性。当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多。

  在往数据表插入数据时,如果一直不能保证该字段一定有值,可以借鉴以下解决方法:

  1)通过设置默认的形式,定义时使用DEFAULT " 或 DEFAULT 0,来避免空字段的产生。

  2)若一张表中,允许为空的列比较多,接近全部列数的三分之一,而且这些列在大部分情况下都可有可无,可以考虑另外建立一张附表,以保存这些列。

MySql字段类型的选择相关推荐

  1. MySQL字段类型如何选择?

    前言 MySQL 中有很多字段类型,比如整数.文本.浮点数,等等.如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度:如果数据类型定义不合理,就有可能会导致数据超出取值范围,引发系统报错,甚 ...

  2. php数据库字段类型,mysql 字段类型说明

    mysql 字段类型说明 更新时间:2007年04月27日 00:00:00   作者: MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用 ...

  3. MySQL字段类型解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  4. MySQL字段类型详解

    MySQL字段类型详解 2009-01-05 09:25 来源:泡菜博客 0个评论 分享文章 A- A+ 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 MySQL支持 ...

  5. MySQL字段类型对应Java字段

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  6. MySql 字段类型对应 Java 实体类型

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  7. 原 hibernate与mysql字段类型对应关系

    原 hibernate与mysql字段类型对应关系 发表于8个月前(2015-04-17 08:56)   阅读(1102) | 评论(0) 2人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC ...

  8. MySQL 字段类型解析

    MySQL字段类型 MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 字符串 char和varchar: 1.char(n) 若存入字符数小于n,则以空格补于 ...

  9. MySQL字段类型与Java中类型的对应

    MySQL字段类型与Java中类型的对应 在设计数据的时候,需要与Java里的类型进行匹配,我自己在设计过程中参考的内容如下 编号 类型名称 显示长度 数据库类型 Java类型 备注/描述 0 VAR ...

最新文章

  1. c++ 获取64位进程模块地址_针对银行木马BokBot核心模块的深入分析
  2. 计算机软件基础-(软件开发过程管理)
  3. 在SAP WebClient UI里显示倒数计时的UI
  4. npm --- 包的发布与导入
  5. [转载] Java9发布回顾Java 8的十大新特性
  6. 对象数组快速掌拨 java 0913
  7. easyui源码翻译1.32--SearchBox(搜索框)
  8. Python使用模块中对象的几种方法
  9. java方法重写和super关键字
  10. python必背入门代码-Python零基础入门学习笔记(一)
  11. 更轻量级的Semaphore、AutoResetEvent、ThreadPool
  12. 微型计算机原理及应用贾金铃,计算机科学与技术专业本科系列教材·微型计算机原理及应用:理论、实验、课程设计...
  13. IDEA 配置log4j
  14. css timeline,一个非常漂亮的时间轴样式timeLine
  15. Linux deepin 15.11设置:输入时禁用触摸板
  16. realme发布最便宜5G手机,心生不忿的小米强调体验不好
  17. 机器学习之PQ量化算法
  18. Javaweb入门基础(尚硅谷,佟刚老师)笔记(一)
  19. Qt输出4位大字十六进制,不足4位左边补0
  20. Vmare安装使用教程

热门文章

  1. 北京:楼盘内部认购禁而不止 业内揭秘花招多
  2. 精美思维导图、流程图模板分享,疯狂提高你的工作效率
  3. android报错空指针_Android空指针的问题。。
  4. Machine Learning Onramp on MATLAB 学习笔记
  5. labview通用视觉软件框架,机器视觉通用框架,里面有安装教程
  6. LINUX 不删除指定文件其余文件全部删除
  7. 记录一下夏普S2手机的解锁以及root的痛苦历程
  8. 最新springBoot_security配置+ jwt 登录实现
  9. 【虹科技术分享】电网中的时间同步
  10. 交易所行情数据采集爬虫