背景
面对单表2千万数据量,且未来一年预计增长1000万的数据库性能问题,我们需要采取一系列优化措施来提升数据库性能。本文将从软优化、硬优化以及分库分表三个方面进行详细讲解。
优化思路
1. 不分库分表--软优化
a. 数据库参数调优
-
调整数据库连接数等参数,以适应业务增长带来的压力。
b. 分析慢查询SQL语句
-
分析执行计划,进行SQL优化和程序改写,以提高查询效率。
c. 优化数据库索引结构
-
通过优化索引结构,减少查询时间,提高数据库性能。
d. 优化数据库表结构
-
调整表结构,如添加索引、优化字段类型等,以提高数据存取效率。
e. 引入NoSQL的程序架构调整
-
通过引入Redis等缓存技术,减轻数据库压力,提高系统响应速度。
2. 不分库分表--硬优化
a. 提升系统硬件
-
升级系统硬件,如更快的IO、更多的内存、带宽、CPU和硬盘,以提高数据库处理能力。
3. 分库分表
a. 根据业务情况指定分表策略
-
根据业务特点,如外卖、物流、电商等领域,制定合适的分表策略。
b. 分表
-
通过分表解决单表数据量过大的问题,提高数据查询效率。
-
注意:分表无法提高数据库并发操作的效率,因为分表操作仍然受限于数据库IO。
c. 分库分表
-
如果分表无法满足需求,再考虑分库分表一起进行,以解决数据库性能瓶颈问题。
分库分表后的优缺点
解决的问题
-
解决数据库本身瓶颈
-
连接数问题:解决因连接数过多导致的性能问题。
-
单表海量数据查询性能问题。
-
单个数据库的性能瓶颈问题。
-
-
解决系统本身IO、CPU瓶颈
-
磁盘读写IO瓶颈。
-
网络IO瓶颈。
-
CPU瓶颈。
-
带来的问题
-
跨节点数据库join关联查询和多维度查询
-
不同维度看数据,利用的partitionKey不一样
-
分库操作带来分布式事务问题
-
执行的SQL排序、翻页、函数问题
-
数据库全局主键重复问题
-
容量规划,分库分表后的二次扩容问题
-
分库分表技术选型问题
分库分表策略
Range策略
-
基于范围进行分库分表,如按照ID范围或时间范围进行分片。
Hash取模
-
通过Hash取模的方式进行分库分表,保证数据均匀分布。
垂直分库分表
-
垂直分表:基于列字段进行拆分,将不常用的字段或大字段拆分到扩展表中。
-
垂直分库:针对不同业务进行拆分,提高并发处理能力。
水平分库分表
-
水平分表:将大表数据拆分到多张表中,每个表只有部分数据。
-
水平分库:将表数据按照一定规则分到不同的数据库中,每个库的数据不重复。
分库分表工具介绍
-
Cobar(已淘汰)
-
TDDL:淘宝开发,基于JDBC规范,功能较少,主要用于阿里内部。
-
MyCat:开源中间件,遵守MySQL原生协议,跨语言、跨平台、跨数据库的通用代理。
-
Sharding-JDBC:基于JDBC驱动,支持任意实现JDBC规范的数据库,无需额外部署和依赖。
总结
在数据量及访问压力不大的情况下,首先考虑缓存、读写分离、索引技术等方案。如果数据量极大且业务持续增长快,再考虑分库分表策略。分库分表可以解决数据库性能瓶颈问题,但也会带来一系列新的挑战,需要根据业务特点和需求进行权衡和选择。