[TOC]
前言:良好的数据库结构逻辑设计和物理设计师数据库获得高性能的基础
数据库结构优化的目的
- 减少数据冗余
- 尽量避免数据威化中出现更新,插入和删除异常
- 插入异常:存在表中的某个实体随着另一个实体存在而存在
- 更新异常:如果更改表中的某个实体类的单独属性时,需要对多行进行更新
- 删除异常:如果删除表中的某一实体则会导致其他实体的消失
- 节约数据库的存储空间
- 提高查询效率
查看表创建的SQL
show create table [tablename]\G
数据库设计的步骤
需求分析
全面了解产品设计的存储需求,数据处理需求,数据安全性和完整性逻辑设计
设计数据的诺机存储结构,数据实体之间的逻辑关系,解决数据冗余和数据维护异常物理设计
根据使用的数据库特点进行表结构设计
关系型数据库 | Oracle,SQL Server,MySQL,postpresSQL |
---|---|
非关系型数据库 | mongo,Redis,Hadoop |
存储引擎 | InnoDB,MyISAM 等 |
-
维护优化
根据实际情况对索引,存储结构等进行优化
数据库设计范式
-
数据库第一范式
数据库表中的所有字段都只具有单一属性
单一属性的列是有基本数据所构成的
设计出来的表都是二维表
复合主键:有多个属性组成的主键
-
数据库第二范式
要求一个表中只具有一个业务主键,也就是说复合第二范式的表中不能存在非主键列只对部分主键依赖 -
数据库第三范式
指每一个非主属性既不部分依赖也不传递依赖于业务主键,也就是在第二范式的基础上消除了对逐渐的传递依赖。
(1)简单归纳:
第一范式(1NF):字段不可分;
第二范式(2NF):有主键,非主键字段依赖主键;
第三范式(3NF):非主键字段不能相互依赖。
(2)解释:
1NF:原子性。 字段不可再分,否则就不是关系数据库;;
2NF:唯一性 。一个表只说明一个事物;
3NF:每列都与主键有直接关系,不存在传递依赖。(同一事物之间的属性的传递性依赖) join解决这个问题
数据库的反范式化设计
前言:完全符合范式化的设计有时候并不能得到良好的SQL查询性能.
反范式化设计是针对于范式化而言的,所谓的反范式化设计就是为了性能和读取效率而适当的对数据库设计方式的要求进行违反,而存在少量的数据冗余,换句话来说就是反范式化设计就是使用空间来换时间.
范式化的优缺点
优点
- 可以尽量的减少数据冗余
- 数据表更新体积小
- 范式化的更新操作比反范式化更快
- 范式化的表通常比反范式化的表更小
缺点
- 对于查询需要对多个表进行关联
- 更难进行索引
- 多张表,多个索引都需要进行更新
反范式化设计的优缺点
优点
- 可以减少表的关联
- 表的关联会加大性能上的消耗
- 可以更好的进行索引进行优化
缺点
- 存在数据冗余和数据维护异常
- 对数据的修改需要更多的成本
总结:在进行数据库设计的时候要合理的使用反范式化设计和范式化设计 ,完全的反范式化和范式化都不一定是最好的方案.
数据库物理设计
物理设计涉及的内容
- 定义数据库、表及字段的命名规范
- 数据库、表及字段的命名要遵守可读性原则
- 数据库、表及字段的命名要遵守表意性原则
- 数据库、表及字段的命名要遵守长名原则
选择合适的存储引擎
为表中的字段选择合适的数据类型
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间晓得数据类型
正确的选择整数类型 int(2)还是会占用4个字节的空间
如何选择正确的实数类型
进度丢失演示
DECIMAL(18,9) 需要9个字节来存储
长18位,小数点后面9位
正确选择VARCHAR和CHAR类型(单位定义是以字符为单位的)
varchar用于变长字符串,只占用必要的存储空间
列的最大长度小于255则只占用一个额外字节用于记录字符串长度
列的最大长度大于255则要占用两个额外字节用于记录字符串长度(修改表的长度超过255就需要锁表,在生产环境中,锁表损失是巨大的)
-
varchar长度的选择问题
- 使用最小的符合需求的长度
- varchar(5)和varchar(200)存储‘MYSQL’字符串性能不同,会消耗更多的内存
varchar的使用场景
1.字符串列的最长长度要比平均长度大很多
2.字符串列很少被更新
3.使用了多字节字符集存储字符串
- char类型的存储特点
- char类型是定长的
2.字符串存储在char类型的列中会删除末尾空格 - char类型的最大长度为255
- char类型的适用场景
1.char类型适合存储所长度近似的值
时间日期存储
TIMESTAMP | 4字节 |
---|---|
DATETIME | 8字节 |
DATE | 3字节 |
DATETIME
6指的是保留6为微秒数
时间范围是1000-01-01 00:00:00 到 9999-12-31 23:59:59
TIMESTAMP
在数据库中只有第一个timestamp是会自动更新的(默认,可以修改)
DATE
如何为InnoDB选择主键
- 主键应该尽可能的小
- 主键应该是顺序增长的,增加数据的插入效率
- InnoDB的主键可以和业务主键不同