关系型数据库是多数业务的核心存储,但随着业务量增长,很容易出现性能瓶颈。下面先介绍常见的扩展思路,再说明NoSQL的选取方法。

关系型数据库的性能扩展思路
1. 读写分离
这是成本较低、落地较快的扩展方式,核心是利用主从复制机制,将写请求发往主库,读请求分摊到多个从库。适合读多写少、读请求占比高的业务场景,比如内容资讯类平台。
实现时需要注意主从同步延迟问题,对一致性要求高的读请求仍要路由到主库。以下是简单的路由逻辑示例:
// 数据库路由简单示例
public class DBRouter {
// 主库数据源
private DataSource masterDataSource;
// 从库数据源列表
private List<DataSource> slaveDataSources;
// 轮询计数器
private AtomicInteger counter = new AtomicInteger(0);
// 根据请求类型返回对应数据源
public DataSource getDataSource(RequestType type) {
if (type == RequestType.WRITE) {
return masterDataSource;
}
// 读请求轮询从库
int index = counter.getAndIncrement() % slaveDataSources.size();
return slaveDataSources.get(index);
}
enum RequestType {
WRITE, READ
}
}2. 分库分表
当单库单表数据量过大(比如单表超过千万行),即使做了读写分离,查询性能还是会下降,这时候需要分库分表。分库是将不同业务模块的数据放到不同数据库实例,分表是将一张大表拆成多张结构相同的子表。
分库分表可以选择垂直拆分或水平拆分:垂直拆分按字段或业务模块拆分,水平拆分按某个字段的哈希、范围等规则拆分数据。拆分后需要引入中间件处理路由、聚合查询等逻辑,常见的如ShardingSphere。以下是水平分表的简单配置示例:
# ShardingSphere分表配置示例
spring:
shardingsphere:
datasource:
names: ds0
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/order_db
username: root
password: root
rules:
sharding:
tables:
t_order:
actual-data-nodes: ds0.t_order_$->{0..1}
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: order-table-inline
sharding-algorithms:
order-table-inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}3. 引入缓存层
对于热点数据,可以在关系型数据库上层加缓存层,比如Redis,优先从缓存读取数据,缓存未命中再查数据库,同时更新缓存。这种方式能大幅降低数据库的读压力,适合热点数据集中、对读取延迟敏感的场景。
NoSQL产品的选取标准
NoSQL产品种类很多,选取时需要结合业务需求,核心参考以下几个标准:
- 数据模型匹配度:根据业务数据结构选择,比如键值结构选Redis,文档结构选MongoDB,宽表结构选Cassandra,图结构选Neo4j。
- 性能需求:关注读写吞吐量、延迟表现,比如对低延迟要求高的场景优先选Redis,对海量数据写入要求高的场景可以选Cassandra。
- 一致性要求:不同NoSQL产品的一致性支持不同,比如Redis是最终一致性,MongoDB可以配置强一致性,需要根据业务对数据一致性的要求选择。
- 运维成本:考虑部署难度、监控工具、社区活跃度,比如Redis生态成熟,运维资料多,小团队落地成本低。
- 扩展性:看是否支持水平扩展,能否方便地在业务增长时增加节点,比如Cassandra、MongoDB都支持天然的水平扩展。
常见场景选型参考
| 业务场景 | 推荐NoSQL产品 | 原因 |
|---|---|---|
| 秒杀库存扣减、热点数据缓存 | Redis | 读写性能极高,支持原子操作,适合高并发场景 |
| 日志存储、海量时序数据存储 | Cassandra | 写入吞吐量高,支持水平扩展,适合海量数据写入 |
| 内容管理系统、灵活字段的业务存储 | MongoDB | 文档模型灵活,不需要固定表结构,适合字段多变的场景 |
实际选型时也可以组合使用多种方案,比如关系型数据库做核心事务存储,NoSQL做非核心、高并发场景的存储,充分发挥不同产品的优势。