接着上一篇文章,继续总结MySQL性能优化。
3.缓存-架构优化
3.1缓存
在系统里面有一些很慢的查询,要么是数据量大,要么是关联的表多,要么是计算逻辑非常复杂,这些查询每次会占用连接很长的时间。
所以为了减轻DB压力,和提升查询效率,我们可以把数据存放到内存缓存起来,比如redis。
缓存适用于篇OLAP类型的业务,这些业务对实时性要求不高,不会频繁更新,例如报表数据,一次查询要半分钟甚至更长时间,但是一天只更新一次。
运行独立的缓存服务,属于架构层面的优化。
为了减少单台服务器的读写压力,在架构层面我们还可以做其他的优化措施。
3.2集群,主从复制
集群这样一种冗余可以提升可用性。
集群必然会面临着不同节点数据一致性的问题。如果同时读写多个数据库节点,怎么让所有节点数据保持一致?
这个时候需要用到复制技术(replication) ,被复制的节点为master,复制的节点为slave。slave本身也可以作为其他节点的数据来源,也就是级联复制。
MySQL的主从复制基本实现:
Mysql所有更新都会记录到server的binlog。
有了这个binlog,slave会不断获取master的binlog文件,然后解析里面的sql语句,在slave上面执行一遍,保持主从数据一致。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210129145611764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2w0NzUxMjgzMDM=,size_16,color_FFFFFF,t_70#pic_center)
这里面涉及到3个线程,连接到master获取binlog,并且解析binlog写入中继日志,这个线程叫做I/O线程。
master上有一个log dump线程是用来发送binlog给slave的。
slave的SQL线程是用来读取relay log 把数据写入数据库的。
(主从配置和原理略)
做了主从复制之后,我们只把数据写入master节点,读的请求可以分担到slave节点。
这种方案叫做读写分离。
对于读多写少的项目,读写分离对于减轻主DB的访问压力很有用。
在集群架构中,所有节点存储的都是一样的数据。如果单表存储的数据量过大的时候,增长迅速,一天几百万,单表查询性能会迅速下降。这个时候我们就要用到分布式架构中第二个重要手段:分片。就是把单个节点存储的数据分散到多个节点存储,减少存储和访问压力,这就是分表分库。
3.3分表分库
分表分库分为两类。
垂直分库,减少并发压力。水平分表,解决存储瓶颈。
垂直分库做法,把一个数据库,按照业务拆分成不同的数据库。
水平分库,把单张表按照一定规则分布到多个数据库。
以上是架构层面的优化,可以用缓存,读写分离,分库分表。这些措施都可以减轻DB访问压力,提升效应效率。
这一部分告一段落,下一部分是开发用的最多的,需要重点掌握的-sql优化。