美文网首页
MySQL性能调优(二)架构优化--表结构合理设计

MySQL性能调优(二)架构优化--表结构合理设计

作者: chanyi | 来源:发表于2020-03-19 19:07 被阅读0次

    文章目录结构
    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中的文本字段长度如下如

    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

    相关文章

      网友评论

          本文标题:MySQL性能调优(二)架构优化--表结构合理设计

          本文链接:https://www.haomeiwen.com/subject/gjxlyhtx.html