1、为什么要优化数据库
(1)因为系统的吞吐量瓶颈很大部分是数据库的访问速度
(2)在数据库中数据量越来越多的情况,会影响访问速度,必须优化来提升访问的速度
(3)数据库的数据是存储在磁盘上,访问速度远小于缓存。
2、如何优化
(1)设计数据库的时候,字段的设计,存储引擎的选择,
(2)可以对数据库进行分库分表,读写分离,还可以进行负债均衡
(3)还可以对SQL语句进行优化
(4)还可以利用好mysql的索引进行优化
3、字段的优化
(1)能使用定长的就使用定长的数据类型,因为非定长的数据类型会随着数据增大而增大,非定长的较大的数据会损失精度。
定长比如:char/double
非定长:varchar text decimal会用额外空间记录长度。
补充:char和varchar的区别
char是一种固定长度的数据类型,比如char(M),就是有固定的M长度,如果数据不够M的话,右边会有空格来补充到M,在varchar(M)类型的数据里,每个值只占用刚好够用的字节,然后加一位记录数据长度的字节,即总长度为(L+1)的字节。
对于char类型来说,最多只能存放的字符个数为255,和编码无关,任何编码最大容量都是255。
MySQL行默认最大65535字节,是所有列共享(相加)的,所以VARCHAR的最大值受此限制
(2)能使用not null 就不用使用null字段,因为非null字段的处理要比null字段的处理高效些,null在mysql中不好处理,并且要额外的空间。
4、表的设计
外键foreign key只能实现一对一或者一对多的映射,如果是多对多的情况下,可以新建一张表,设计两个一对多的表和一个关系表。
例如 老师表 和 学生表
套路一样 先站在老师表 在站在学生表
老师表角度: 一个老师可以对应多个学生 一对多
学生表角度: 一个学生可以对应多个老师 一对多
如果双方都是一对多的关系 那么 两者是多对多关系。
三大范式
(1)第一范式:数据库中每一个列都不允许被拆分,例如一个列中不能有逗号把它们拆分成两段
(2)第二范式:在第一范式的基础上,非主键列必须完全依赖于主键,而不能只依赖于主键的一部分。(即主键有两个字段,而非主键只依赖主键中的一个字段,有ID和课名两个主键,而姓名通过ID就可以确定,不需要课名)
解决方案:把这个表拆分成两个表。
(3)第三范式:在第二范式的基础上,非主键只能依赖于主键,不能依赖于其他非主键。
比如一个学生表有学号,学号对应的学院名称,学院表对应的学院主任,而只有学号是主键,但是学院主任还依赖非主键学院名称,所以就拆分成两个表。