打开

如何让你的数据库更加合理?

subtitle
石头钱币 2021-12-05 06:25

一、为什么要进行数据库优化?

当完成一个项目后,如果需要优化该项目的性能和提高并发性,就要用到数据库优化操作

二、如何进行数据库优化?

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、连接数、硬件资源的瓶颈。

缺点:硬件成本较高,也会带来一些复杂的技术问题和挑战

(例如:跨分片的复杂查询,跨分片事务等)

特别声明:本文为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点。网易仅提供信息发布平台。
帮TA点赞
大家都在看打开应用 查看全部
网易热搜每30分钟更新
打开应用 查看全部
打开