MySQL数据库结构优化

良好的数据库逻辑设计和物理设计是数据库获得高性能的基础

数据库结构优化的目的

1.减少数据冗余
2.尽量避免书维护中出现更新,插入和删除异常

  • 插入异常:如果表中的某个实体随着另一个实体而存在,则无法插入
  • 更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新
  • 删除异常:如果删除表中的某一实体则会导致其他实体的消失

3.节约数据存储空间
4.提高查询效率

数据库设计的步骤

需求分析

  • 全面了解产品设计的存储需求
  • 存储需求
  • 数据处理需求
  • 数据的安全性和完整性

逻辑涉及

  • 涉及数据的逻辑存储机构
  • 数据实体之间的逻辑关系,解决数据冗余和数据维护异常

物理设计:根据所使用的数据库特点进行表结构设计

  • 关系型数据库: Oracle,SQLServer,Mysql,postgresql
  • 非关系型数据库:mongo,redis,hadoop
  • 存储引擎:Innodb

维护优化

  • 根据实际情况对索引、存储结构等进行优化

数据库设计范式

是数据库设计规范,为了设计出没有数据冗余和数据维护异常的数据库结构

第一范式

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

第二范式

  • 要求一个表中只具有一个业务主键,不能存在非主键列只对部分主键的依赖关系

第三范式

  • 指每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖

反范式化设计定义

为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反,而允许存在少量的数据冗余,换句话来说反范式化就是使用空间来换取时间。

范式化设计优点

  • 可以尽量的减少数据冗余。数据表更新快体积小
  • 范式化的更新操作比反范式化更快
  • 范式化的表通常比反范式化更小

反范式化设计的优缺点

  • 优点:减少表的关联;可以更好的进行索引优化
  • 缺点:存在数据冗余及数据维护异常;对数据的修改需要更多的成本

物理设计

根据所选择的关系型数据库的特点对逻辑模型进行存储结构设计

  • 定义数据库、表及字段的命名规范
    • 数据库、表及字段的命名要遵守可读性原则
    • 数据库、表及字段的命名要遵守表意性原则
    • 数据库、表及字段的命名要遵守长名原则
  • 选择合适的存储引擎


  • 为表中的字段选择合适的数据类型
    当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。因为数字类型排序快,占用空间少



如何选择VARCHAR和CHAR类型

VARCHAR类型的存储特点

  • varchar用于存储变长字符串,只占用必要的存储空间
  • 列的最大长度小于255则只占用一个额外字节用于记录字符串长度
  • 列的最大长度大于255则要占用两个额外字节用于记录字符串长度
    注意单位是字符而不是字节,有些开发人员认为10个UTF-8的字符,就应该设置varchar(30),其实varchar(10)就够了,因为单位是字符。

VARCHAR长度的选择问题

  • 使用最小的符合需求的长度
  • varchar(5)和varchar(200)存储‘MySQL’字符串性能不同,varchar(5)会更好一些。

VARCHAR的适用场景

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

CHAR类型的适用场景

  • 适合存储长度近似的值。适合存储加密密码,身份证这种长度相对固定的字段
  • 适合存储短字符串。对于性别这种字段,比较短小,用varchar更占空间,所以用char好
  • 适合存储经常更新的字符串列。减少存储碎片。关于碎片建议看看这篇文章https://www.cnblogs.com/lovebing/p/7463532.html

如何存储日期数据

  • DATETIME类型
    以YYYY-MM-DD HHSMM:SS[.fraction]格式存储日期时间
    datetime=YYYY-MM-DD HH:MM:SS
    datetime(6)=YYYY-MM-DD HH:MM:SS.fraction
    DATETIME类型与时区无关,占用8个字节的存储空间
    时间范围1000-01-01 00:00:00到9999-12-31 23:59:59
  • TIMESTAMP类型
    存储了由格林尼治时间1970年1月1日到当前时间的秒数以YYYY-MM-DD HH:MM:SS.[.fraction]的格式现实,占用4个字节时间范围到1970-01-01到2038-01-19
    timestamp类型现实依赖于所指定的时区,在行的数据修改时可以自动修改timestamp列的值。
  • date类型和time类型
    date类型的有点:占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要3个字节;使用Date类型还可以利用日期时间函数进行日期之间的计算
    date类型用于保存1000-01-01到9999-12-31之间的日期,time类型用于存储时间数据,格式为HH:MM:SS
  • 存储日期时间数据的注意事项
    不要使用字符串类型来存储日期时间数据。日期时间类型通常比字符串占用的存储空间小;日期时间类型在进行查找过滤时可以利用日期来进行对比;日期时间类型还有着丰富的处理函数,可以方便的对日期类型进行日期计算。

如何为innodb选择主键

1.主键应该尽可能的小
2.主键应该是顺序增长的,这样可以增加数据的插入效率
3.Innodb的主键和业务主键可以不同

  • 建立数据库的结构

你可能感兴趣的:(MySQL数据库结构优化)