文章目录结构
1、表结构设计优化
2、表数据存储
1、二进制多媒体文件
2、流水队列数据
3、超大文本数据
表结构的设计十分重要,如果一开始表结构的设计有问题,那么之后再怎么优化也都不会有很大的提升。
1、表结构设计优化
表结构基础设计原则
在表结构设计上,通常有是按照范式来设计。
1、范式
关系数据库有六种范式:
第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)
第一范式
要求任何一列都保持原子性,存储的元素不可再分,不能存储数组,集合等其他非原子性实体。
第二范式
在第一个范式的基础上,非码属性必须依赖于候选码。也就是说数据库表中的每一列都和主键相关。如果有不和主键相关的列,应该分为两个表,分别存储
第三范式
在2NF基础上要求,任何非主属性不依赖于其它非主属性,在2NF的基础上消除了传递依赖。
也就说,数据表中的每一列都应该和主键直接相关,不能间接相关。比如学生学号为主键是,表中存在老师姓名,年龄等字段时,就违反了第三范式,老师的姓名和年龄间接相关与主键学生学号,但是不直接相关。这样的情况需要将间接相关的列单独分为一个表。
巴斯-科德范式(BCNF)
属于第三范式的修正。在第三范式的基础上,要求任何非主属性不能对主键子集依赖。也就是说每列都和主键强相关,而且每列彼此之间也要相对一一映射。例如,表中字段(仓库名,管理员,存放物品名,存放数量),这个表很显然,管理员和存放物品名,存放数量之前没有太多关联。所有应该吧管理员字段拿出来,单独建立表。
一般来说,一个数据表的设计符合第三范式或者BCNF就可以了。
第四范式
在第三范式的基础上,消除主键的多值依赖。简单说就是,数据表中不能出现一对多的情况。
第五范式
在第四范式的基础上,将表分割成尽可能小的多个表,进一步消除冗余。
2、表结构的最优设计
实际情况中,为了系统的最优设计,不一定要严格遵循6个范式,根据实际情况设计表结构。
适度冗余,让Query尽量减少Join
在对Query优化是,最直接最有效的优化方式就是减少Join。根据需求,在一些查询频繁更新不频繁的数据表中,可允许适当的冗余,减少Join的表。
大字段垂直拆分
如果有些表中含有大字段,比如存放一些较长的详情信息,产品介绍,文章内容的字段,可以拆分出来,还有一些使用频率不是很高的字段,也可以拆分出来,独立放在一个表中。
大表的水平拆分
如果一个大表中的一小部分记录使用的频率很高,而其他的大多数字段使用频率不是很高的情况下,可以考虑将使用频率高的字段,单独放在一个表中。比如,论坛中的文章,需要将一些精品帖子置顶,那么可以将置顶的文章单独存储在一个新的表中。
统计表-准实时优化
在做一些需要实时统计的需求时,其实不需要一定实时展示准确的数据。一般统计的计算都会涉及到大量的数据,需要大量的计算资源,访问的频率非常高,需要很大的开销。所以可以通过定时任务,隔一段时间统计一次,将统计好的数据存放在专门的统计表中。
2、表数据存储
MySQL的数据表中数值类型的长度及大小,如下图:
MySQL数值类型长度
1、时间字段的选择
根据上面的图可以看出,时间的选择可以使用DateTime和Timestamp两种,DateTime比TImestramp多出一倍的占用空间,但是Timestramp的最早只能存储1970年之后的时间,DataTime可以存储从1001年之后的时间。所以在实际的使用场景中做具体的考虑。
显然不应该将所有数据都存储到数据库中。
2、文本字段的选择
MySQL中的文本字段长度如下如
MySQL5.0.3版本之前M表示字符数,之后表示字节数。
char和varchar的区别
(char)
char表示定长字符串,长度是固定的;
如果插入数据的长度小于char的固定长度时,则用空格填充;
因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;
对于char来说,最多能存放的字符个数为255,和编码无关
(varchar)
varchar表示可变长字符串,长度是可变的;
插入的数据是多长,就按照多长来存储;
varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;
对于varchar来说,最多能存放的字符个数为65532
四种动态存储类型
需要注意的是,TinyText,Text,MediumText,LongText四个类型都是动态存储长度类型。
实际能存储的长度要比规定长度要小。
另外二进制文件多媒体数据,流水队列数据和超大文本数据不应该存储到数据库中
二进制多媒体文件
空间资源消耗严重
消耗数据库主机的cpu资源
流水队列数据
流水队列数据有太多次的增删改,数据库(支持事务的存储引擎)会产生大量的日志文件
超大文本数据
由上图可知:VARCHAR最长存放255字节, TEXT最长存放64KB LONGTEXT最长存放4GB
性能:VARCHAR>TEXT>LONGTEXT
参考资料:
1、《MySQL性能调优与架构设计》
2、http://www.mamicode.com/info-detail-2695431.html
3、https://blog.csdn.net/qq_29034779/article/details/81697467
网友评论