文章目录
- 1. 优化MySQL服务器
- 2. 优化数据库结构
- 2.1 差分表:冷热数据分离
- 3. 大表优化
- 3.1 读/写分离
- 3.2 垂直拆分
- 3.3 水平拆分
1. 优化MySQL服务器
电商平台,双十一,CPU使用率达到99%,系统的计算资源已经耗尽,再也无法处理任何新的订单了。
这个时候,我们想到了对系统参数
进行调整,一共调整3个系统参数,分别是
- InnoDB_flush_log_at_trx_commit:默认为0,改为2,这样就不用每次提交事务的时候都启动磁盘读写了,而是每隔一秒
- lnnoDB_buffer_pool_size:InnoDB存储引擎使用缓存来存储
索引
和数据
,可以加载到缓存区的索引和数据量就越多,需要的磁盘读写就越少。 - lnnoDB_buffer _pool_instances:可以将InnoDB的缓存区分成几个部分,这样可以提高系统的
并行
处理能力,因为可以允许多个进程同时处理不同部分的缓存区。
2. 优化数据库结构
2.1 差分表:冷热数据分离
把1个包含很多字段的表拆分成2个或者多个相对较小的表,(热数掘):经常要进行查询或者更新操作。(冷数据):字段的使用频率却很低。冷热数据分离,可以减小表的宽度。查询是B+tree存放的索引和叶子节点的数据就少了,一次读取的就多了,性能就高了。
3. 大表优化
3.1 读/写分离
3.2 垂直拆分
垂直分库、垂直分表
- 如果数据库中的数据表过多,可以采用垂直分库的方式,将关联的数据表部署在同一个数据库上。
- 如果数据表中的列过多,可以采用垂直分表的方式,将一张数据表分拆成多张数据表,把经常一起使用的列放到同一张表里(冷热数据分离)
3.3 水平拆分
这里主要考虑业务数据的水平分表策略。将大的数据表按照某个属性维度分拆成不同的小表,每张小表保持相同的表结构
。比如可以按照年份来划分,把不同年份的数据放到不同的数据表中。2017年、2018年和2019年的数据就可以分别放到三张数据表中。
下面补充一下数据库分片
的两种常见方案:
- 客户端代理:分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。当当网的
sharding-JDBC
、阿里的TDDL是两种比较常用的实现。 - 中间件代理:在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。我们现在谈
Mycat
、360的Atlas、网易的DDB等等都是这种架构的实现。