数据库优化
一、为什么要进行数据库优化?
当完成一个项目后,如果需要优化该项目的性能和提高并发性,就要用到数据库优化操作
二、如何进行数据库优化?
2.1在设计数据库表时要使用三范式设计,那什么是三范式呢?
第一范式(1NF):符合1NF的关系中的每个属性都不可再分,1NF是所有关系型数据库的最基本要求
第二范式(2NF):2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖
第三范式(3NF):3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖
BCNF范式:在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
三范式基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题,体现了以空间换时间的理念
2.2建立MySQL索引:
1.索引类型:主键 、唯一索引(unique index)、普通索引(key index)、组合索引、外键
2.其中组合索引使用时必须遵循最左原则:
比如如果建立组合索引的字段是usernama,city,age,
那么查询时只有usernname,city,age、usernname,city、usernname 才会用到该索引
3.建立索引的优缺点:
优点:大大提高了数据库查询效率
缺点:降低了更新表的速度(增删改),原因是MySQL索引建立后会生成一个索引文件,
该索引文件使用的是二叉树数据结构,当我们每次更新表数据时,
它对应的索引文件都需要进行重构,如果索引太多而该表的数据又经常更新的话,
就会频繁的重构索引文件,导致速度大大降低
2.3 SQL语句优化:
1.查询数据时不要使用select *
2.能使用联合查询,不使用嵌套(子查询),能不使用联合查询,尽量不用联合查询
3.如果数据量很大的时候,就不再使用外键,因为维护外键有额外的开销,影响性能,可以在代码中控制数据一致
4.使用慢查询分析工具分析效率低的sql语句
2.4使用缓存:
使用内存型数据库redis缓存数据,减少数据库查询操作
2.5数据库使用读写分离架构:
1.读写分离的架构如下图所示:
2.该架构的实现方法将主数据库的数据备份到多个从数据库中,当主数据库执行sql语句时,
它会将sql语句发给所有从数据库执行,保证了数据的一致性,我们把这种操作称为主从热备份
2.6当数据量非常庞大的时候,可以使用分库分表:
1.分库分表的几种类型详解:
a.垂直分表:
概念:垂直分表在日常开发和设计中比较常见,通俗的说法叫做“大表拆小表”
将表中的部分字段拆分到扩展表中
优点:在字段很多的情况下,拆分开确实更便于开发和维护,某种意义上也能避免“跨页”的问题 (MySQL底层都是通过“数据页”来存储的,“跨页”问题可能会造成额外的性能开销)
b.垂直分库:
概念:按照业务模块来划分出不同的数据库,避免将所有数据表放到同一个数据库中
优点:数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,
垂直分库一定程度上能够突破 IO、连接数及单机硬件资源的瓶颈,
是大型分布式系统中优化数据库架构的重要手段。
缺点:拆分时一定要注意拆分的各个库之间必须相互独立,不然拆分后会遇到很多问题
c.水平分表
概念:将表中不同的数据行按照一定规律分布到不同的数据库表中
(这些表保存在同一个数据库中)
优点:能够降低单表的数据量,一定程度上可以缓解查询性能瓶颈
缺点:本质上这些表还保存在同一个库中,所以库级别还是会有 IO 瓶颈。
所以,一般不建议采用这种做法。
d.水平分库分表:
概念:将水平分表分出的表分别存放在不同的数据库中
优点:在高并发和海量数据的场景下,分库分表能够有效缓解单机和单库的性能瓶颈和压力,
突破 IO、连接数、硬件资源的瓶颈。
缺点:硬件成本较高,也会带来一些复杂的技术问题和挑战
(例如:跨分片的复杂查询,跨分片事务等)