Mysql范式与数据类型选择

良好的逻辑设计与物理设计是高性能的基石,当咱们在设计数据表结构的时候,应该跟根据业务逻辑来分析具体状况,而后设计出比较合理,高效的数据表结构

在数据表结构设计中,不得不提的就是范式数据类型mysql

Mysql三范式

  • 字段不可分;即字段具备原子性 字段不可再分,不然就不是关系数据库;
  • 有主键,非主键字段依赖主键; 惟一性 一个表只说明一个事物
  • 非主键字段不能相互依赖;每列都与主键有直接关系,不存在传递依赖
范式的优势与缺点
  • 优势sql

    • 范式化设计更新一般比反范式化更新要快
    • 当数据高度范式化时,就只有少许或者没有重复数据,这样修改的时候就只须要修改少许的数据
    • 范式化的表一般比较小,能够更好的放在内存里面,操做就会更容易
    • 由于范式化设计以后,冗余数据较少,因此在执行某些查询的时候可能就不会用到group bydistinct 这样也提升了查询效率
  • 缺点
    由于严格遵循范式化设计的话。在某些业务场景下可能会查询多个表。这样的一样会使得查询效率变的很低。并且在某些时候由于多表查询的缘由,可能某些索引不会被命中。

这里咱们看到范式化的设计有优势也有缺点,因此在实际的项目中,咱们一般是混范式化设计。
某些表彻底遵循范式化;某些表遵循部分范式化设计。在设计某些表的时候 会用到反范式化的思想,将某些数据存到同一张表中。这样能够减小不少关联查询,也能够更好的去设计索引关系。数据库

好比 users表 与 user_messages表中,都会保存一个 user_account_type字段。这样的话,在单独查询 user_account_type=1的消息总数时就不须要再去关联 users表了。

数据类型

Mysql支持的数据类型有不少种,因此选择正确的数据类型对提升性能有着相当重要的做用。可是无论哪一种数据类型咱们都应该参考下面几个原则缓存

  • 更小的一般更好;更小的数据类型一般更快,由于他们占用更少的磁盘、内存、CPU缓存。
  • 简单就好;操做简单的数据类型一般须要更少的CPU周期。例如:整型比字符串操做代价更低
  • 尽可能避免NULL;若是查询中包含可为Null的列,对于Mysql来讲更难优化,由于能够为null的列使得索引,索引统计和值都变的更加复杂
整数类型

Mysql的整数类型有 TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。他们使用到的储存空间分别是,8,16,24,32,64位。值的范围是-2(N-1)到2(N-1)-1
整形能够选择UNSIGNED属性,表示是否有符号,不容许为负值。
如 TINYINT UNSIGNED 值的范围 0~255, 而 TINYINT 值的范围是-128-127。须要注意点是有符号跟无符号使用相同的储存空间,拥有相同的性能,因此能够根据实际状况来选择类型。性能

字符串类型

VARCHAR,CHAR是两种最主要的字符串类型,优化

  • VARCHAR类型用于储存可变字符串,是常见的字符串类型。它比定长类型更节省空间。
  • CHAR定长字符串类型,分配固定长度的空间。在保存某些定长字符串时比VARCHAR更有优点、好比md5定长字符串,由于定长类型字符串不容易产生碎片。
对于 VARCHAR(5)VARCHAR(100)储存 hello的空间开销是同样的,那么是否是咱们就能够定义长度为 100呢?固然不是了,更长的列会消耗更多的内存,由于Mysql一般会分配固定大小的内存块来保存内部值。因此最好的策略就是分配合理的长度,这样就分配到真正须要的 空间。
日期,时间类型
  • DATETIME类型,可以保存1001-9999年,精度为秒,与时区无关。
  • TIMESTAMP类型,保存了从1970-01-01午夜到如今的秒数,只使用了4个字节,只能表示1970-2038年。TIMESTAMP依赖于时区。TIMESTAMP在默认状况下,若是没有指定列的值,会把列的值设置为当前时间,在更新的时候也能够更新列的值为当前时间。

一般状况下应该尽可能使用TIMESTAMP,由于它比DATETIME空间效率更高,有时候咱们会将Unix时间戳保存为整数值以表示当前时间,实际上并不会带来任何收益。spa

上面列举了几个经常使用的 mysql类型,在实际使用中能够根据业务选择最优的方案。通常状况下遵循 更小的一般更好, 简单就好 , 尽可能避免NULL是没有问题的。

关于mysql的数据类型选择,就写到这里。后面也会写一些关于索引优化方面的文章,若是问题欢迎你们指出。
图片描述设计

相关文章
相关标签/搜索