0%

MySQL学习笔记-数据库结构优化

目的

减少数据冗余

尽量避免数据维护中出现更新,插入和删除异常

  • 插入异常

    • 如果表中的某个实体随着另外一个实体存在而存在
  • 更新异常

    • 如果更高表中的某个实体的单独属性时,需要对多行进行更新
  • 删除异常

    • 如果删除表中的某一实体则会导致其他实体的消失

节约数据存储空间

提高查询效率

数据库设计范式

第一设计范式

  • 数据库中表的所有字段都只具有单一属性
  • 单一属性的列是由基本的数据类型所构成的
  • 设计出来的表都是简单的二维表

第二设计范式

  • 一个表中具有一个业务主键

第三设计范式

  • 每一个非主属性,既不部分依赖于也不传递依赖于业务主键

反范式化设计

  • 少量的数据冗余,提高查询效率。空间换时间。

优缺点

  • 范式化

    • 优点

      • 可以尽量的减少数据冗余

        • 数据表更新快,体积小
      • 范式化的更新操作比反范式化更快

      • 范式化的表通常比反范式化更小

    • 缺点

      • 对于查询需要对多个表进行关联
      • 更难进行索引优化
  • 反范式化

    • 优点

      • 减少表关联
      • 更好的进行索引优化
    • 缺点

      • 存在数据冗余以及数据维护异常
      • 对数据的修改需要更多的成本

物理设计原则

定义数据库,表以及字段的命名规范

  • 可读性原则
  • 表意性原则
  • 长名原则

选择合适的存储引擎

为表中的字段选择合适的数据类型

  • 当一个列可以选择多种数据类型的时候,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先考虑占用空间小的数据类型

  • Varchar和char

    • varchar

      • Varchar类型的存储特点

        • VARCHAR用于存储变长字符串,只占用必要的存储空间
        • 列的最大长度小于255则只占用一个额外的字节,用于记录字符串长度
        • 列的最大长度大于255则占用两个额外的字节,用于记录字符串长度
      • VARCHAR长度的选择问题

        • 使用最小的符合需求的长度
        • varchar(5)和varchar(200)存储‘MYSQL’字符串性能不同
      • varchar的适用场景

        • 字符串列最大长度比平均长度大很多
        • 字符串列很少被更新
        • 使用了多字节字符集存储字符串
      • char类型是定长的

    • char

      • Char类型的存储特点

        • 字符串存储在char类型的列中会删除末尾的空格
        • Char类型的最大宽度为255
      • char类型的适用场景

        • char类型适合存储长度近似的值

          • 比如MD5,手机号,身份证号
        • char类型适合存储短字符串

        • char类型适合经常更新的字符串列

  • 如何存储日期类型

    • DATATIME类型

      • 占用8字节存储空间

      • 时区无关

      • 时间范围

        • 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
      • 存储格式

        • YYYY-MM-DD HH:MM:SS[.fraction]
    • TIMESTAMP

      • 存储了由格林尼治时间到当前时间的秒数

      • 占用4字节

      • 时间范围

        • 1970-01-01到2038-01-19
      • 依赖于所指定的时区

      • 在行的数据修改时,可以自动修改timestamp列的值(根据时间戳自动更新)

      • 默认第一个列是随着更改自动更新

    • date类型

      • 只需要3个字节
      • 可以使用时间函数
      • 时间范围1000-01-01~9999-12-31
    • time类型

      • 用于存储时间数据
      • HH:MM:SS
    • 存储日期时间数据的注意事项

      • 不要使用字符串类型来存储日期时间数据
      • 日期时间类型通常比字符串占用的存储空间小
      • 日期时间类型在进行查找过滤时可以利用日期来进行对比
      • 日期时间类型还有着丰富的处理函数,可以方便的对时间进行日期计算
      • 使用Int存储日期时间不如使用Timestamp类型

附件:Xmind图

数据库结构优化