这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
前言
作为一个后端开发的程序猿,我们每天都要跟数据库打交道,行业越来越卷,当初面试的时候知道简单的增删改查,各种关联查询,一些索引优化就可以应付面试时数据库这块。但是看看现在的招聘信息,基本上都是要求有过数据库优化经验的优先。本着提升自己的目的,决定系统学习整理一下有关数据库优化方面的知识。
影响性能的主要因素
相信大家面试的时候都有被问到过,对数据库优化是否有过了解,或者直接点是否有过优化数据库的经历,如果有,你是从哪些方面进行优化的?没有学习之前,就以往工作经验,我好想也只知道加索引,加冗余字段减少关联查询。当然很多人上来就是分库分表,可能确实本人接触的项目太小没有在实际开发中接触过,但是在平时学习视频中多少有所了解,感觉就是小项目用不到,大项目自己也搞不定。
影响数据库性能的主要因素有哪些?
- 数据库结构设计
- 数据库存储引擎
- SQL语句的书写
- 数据库参数配置
- 服务器操作系统与硬件
数据库设计三范式
使用数据库,就离不开数据库表结构的设计,我们需要了解数据库设计的三大范式
- 第一范式
- 所有字段都有单一属性,一个字段只有一个属性,不可拆分
- 单一属性是由基本数据类型构成
- 数据库的表都是二维的,由行列组成
- 第二范式
- 要求符合第一范式
- 表必须有一个主键(一列或多列)
- 其它字段可由主键确定(拆表的时候其它字段与主键关联)
- 二范式目的是通过拆表解决数据的冗余
- 第三范式
- 要符合第二范式
- 字段要求直接依赖于主键,不允许间接依赖
- 第三范式的目的在于拆分实体(完善主从表)
注意:在设计时,我们应当满足三大范式,但是实际开发中我们应该根据实际情况调整,以达到设计的合理性,比如适当加入冗余字段,可以减少表的关联,提高查询速度。
实体关系分析
除了遵循设计规范,我们应当还具备实体关系分析的能力
- 实体关系是指系统事物之间的关系
- 实体关系需要双向分析
- 实体关系决定表关系
实体关系的种类
- 一对一
- 一对多
- 多对多
表关系设计原则
- 一对一:通过主键关联
- 一对多:在多的一方设置外键
- 多对多:增加中间表,持有双方外键
图解
自然主键与代理主键
- 自然主键是指事物属性中的自然唯一标识,如身份证号
- 代理主键是指与业务无关的,无意义的数字序列值
- 在表设计时,优先使用代理主键,不推荐自然主键,便于迁移,数据类型统一,不具有泛用性