第一.数据库优化包括哪些方面
数据库优化是一个综合型的技术,并不是通过某一种方式让数据库效率提高很多,而是通过多方面的提高,从而使的数据库提高很多
主要包括:
1.表的设计合理化(三范式)
2.给表要添加合适的索引
3.分表技术(水平分割、垂直分割)
4.定时清除垃圾数据,定时进行碎片整理
5.对mysql的配置进行一些优化
6.读写分离
第二.数据库的设计
2.1好数据库和糟糕数据库的对比
良好的数据库:
1.节省存储空间
2.保证数据完整性
糟糕的数据库
1.数据冗余,存储空间的浪费
2.产生数据不完整
2.2 设计数据库的步骤
2.2.1充分了解需求
2.2.2标识实体:具体存在的对象,名词
对象如下
用户
发帖
回帖
版块
2.2.3标识属性
2.2.4.标识关系
一对多:主键和非主键之间的关系,在多的一方创建一个字段作为外键指向一的一方的主键
多对多:创建一个第三种表,中间表至少需要2个字段分别作为外键指向多对多双方的各自主键
一对一:
唯一外键对应:假设一对一的双方是一对多的关系,在多的一方创建外键指向一的一方的主键,需要在外键
上添加一个unique约束
主键对应:将一对一的双方的主键建立映射
2.3数据库规范化
表设计出来以后,并不是合理的结构,我们需要对表进行规范化(我们通过3范式来对表进行规范化)
2.3.1 第一范式(确保每列的原子性)
第一范式用来规范所有的字段,所有的字段都不可再分,两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
注意:比如地址这个字段,如果不分类汇总,不排序,仅仅是起一个字符串的作用,这时我们不拆分
上图所示的用户信息遵循第一范式的要求,这样对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.3.2第二范式非主键字段必须依赖与主键字段,每个表只描述一件事
第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下图。
这里产生一个问题:这个表中是以订单编号和商品编号作为联合主键,这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,
而仅仅是与商品的编号相关,所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了,如下图。
这里这样设计,在很大程度上减小了数据库的冗余,如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
2.3.3第三范式消除传递依赖
在非主键字段中,如果一个字段可以推导出另外一个字段
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系,而不可以在订单表中添加关于客户其他信息(比如姓名、所属公司)的字段,
如下面这两个表所示的设计就是一个满足第三范式的数据库表。
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必再订单信息表中多次输入客户信息的内容,减小了数据冗余。
2.3.4反三范式
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,
适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,
达到以空间换时间的目的
。
2.3.5规范化和性能
1.数据库性能和规范化数据库更重要
通过在给定的表中添加额外的字段,以减少需要从中搜索信息所需要的时间
通过在给定的表中插入计算列(查询总分),以方便查询
2进行规范化的同时,还需要综合考虑数据库性能
2.3.6范式化设计和反范式化设计的优缺点
1.范式化
优点
缺点
2.反范式化
优点