MySQL主要优化手段介绍
MySQL常用优化手段:数据读写分离与数据库Sharding
数据读写分离
在大多数的业务场景,都是读多写少,因此进行数据库的读写分离是一件非常简单且有效率的方案。
读写分离简单点来说就是把数据的读操作和写操作分开,让这两种操作去访问不同的数据库,这样就可以减轻数据库的压力
从阿里云的读写分离可以看出数据库会有一个“主实例”,这个主要用来提供写操作(偶尔也会承担读操作),除了“主实例”还有多个“只读实例”,“只读实例”只用来进行读请求。
在多个数据库中保证一致性,我们可以通过MySQL的master-slave功能实现,这个功能是基于二进制日志复制来实现的。
那解决了一致性问题,我们应该如何让写请求和读请求找到相应的实例呢?
- 使用编码方式(不建议使用这种方式,这种方式更像硬编码)
- 使用中间件
MySQL-Proxy、MyCat、ProxySQL都是很好的中间件开发
CQRS(Command Query Responsibility Segregation)命令(增删改)和查询的责任分离
CQRS重点强调的就是Query(读)和Command(写)的分离,Command主要做业务逻辑的执行,Query来负责数据查询和展示。同时,这两种操作是基于不同的数据源,甚至是一个数据库,另一个是NoSQL都可以。
Sharding(分库分表)
随着数据库里的数据越来越多,单表查询的性能已经不能满足业务要求了,这个时候就需要进行分表处理了,将大表拆分为若干个小表,不同的分表中数据也不一样,这样可以分散查询压力,提高处理效率
其实分库分表只是我们通俗的便于理解的说话,正确的描述应该是:数据分片
数据的分片主要有2种模式:垂直拆分、水平拆分
垂直拆分,是指按照业务模块进行拆分。简单来讲,就是把业务紧密的模块的字段/表放在一起,放在同一个数据库或者服务器上。将不同业务的字段/表进行独立,拆到不同的数据库或者服务器上。
水平拆分,是指纯粹的按照某种数据规则/格式进行拆分。例如,按照数据唯一ID的哈希散列拆分、按照数据的日期拆分、按照某种范围拆分等等。水平拆分需要注意的是,随着数据动态的变化,分片数量可能需要随之动态调整,另外就是水平分片是没有考虑业务特征的,因此在进行业务汇总查询或者分片中事务处理的时候就比较麻烦一些
在实际应用中,两种拆分模式一般会结合在一起使用,效果会更佳。