关系型数据库(Relational Database)是基于关系模型的数据库系统,使用结构化查询语言(SQL)进行数据操作。其核心特征是通过二维表结构组织数据,表之间通过主键和外键建立关联关系。自1970年Edgar F. Codd提出关系模型以来,Oracle、MySQL、PostgreSQL等经典系统持续演进,形成了现代企业级应用的存储基石。
关系型数据库的ACID特性保障了事务的可靠性:
以电商系统为例,订单表与用户表通过用户ID关联,库存表通过商品ID与订单明细关联,这种严谨的关系模型确保了交易流程的数据完整性。
随着互联网应用的爆发式增长,传统单机数据库面临三重挑战:
MySQL默认的InnoDB引擎在单表千万级数据时,复杂查询性能急剧下降。某社交平台案例显示,用户表达到2亿行时,带条件分页查询延迟超过3秒,直接影响用户体验。
读写分离的基本原理是将数据库的读写操作分散到不同的数据库节点上,
通过二进制日志(binlog)实现的主从复制是读写分离的基础:
典型部署架构包含:
某视频平台的实践表明:
需特别注意:
数据库的读写分离虽然大大减轻了读写操作的压力,但是当数据库的数据库过大时,单台数据库的存储性能便成了系统的瓶颈,主要体现在
按业务模块划分数据库:
某跨境电商案例:
大字段拆分示例:
-- 原始表
CREATE TABLE article (
id BIGINT PRIMARY KEY,
title VARCHAR(200),
content LONGTEXT, -- 平均10KB
author_id BIGINT,
created_at DATETIME
);
-- 拆分后
CREATE TABLE article_base (
id BIGINT PRIMARY KEY,
title VARCHAR(200),
author_id BIGINT,
created_at DATETIME
);
CREATE TABLE article_detail (
article_id BIGINT PRIMARY KEY,
content LONGTEXT
);
算法类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
范围分片 | 易于范围查询 | 数据分布不均 | 时间序列数据 |
哈希分片 | 数据均匀分布 | 扩容复杂 | 高并发随机访问 |
一致性哈希 | 扩容影响小 | 实现复杂度高 | 动态扩展环境 |
地理位置分片 | 降低访问延迟 | 需要业务适配 | 区域性服务 |
某金融系统遇到的挑战:
无论是读写分离还是分库分表,本质上都是一中分配机制,将不同的操作sql发送到不同的数据库服务器,常见的实现方式分为两种:代码封装和中间件封装实现
Spring Boot + MyBatis示例:
@Configuration
public class RoutingDataSourceConfig {
@Bean
@Primary
public DataSource routingDataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource());
targetDataSources.put("slave1", slave1DataSource());
targetDataSources.put("slave2", slave2DataSource());
RoutingDataSource routingDataSource = new RoutingDataSource();
routingDataSource.setTargetDataSources(targetDataSources);
return routingDataSource;
}
public class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TransactionSynchronizationManager.isCurrentTransactionReadOnly()
? "slave" : "master";
}
}
}
需注意:
相比于代码封装,中间件封装指的是使用第三方或者独立开发一套系统,专注于实现读写分离和分库分表操作,其它业务服务器调用这个系统,对于其它业务服务器来说,访问中间件和访问数据库没有什么区别,这里其实也是松耦合的一种体现。
常见数据库中间件对比:
中间件 | 协议层 | 功能特性 | 公司 |
---|---|---|---|
ShardingSphere | JDBC驱动 | 全功能分片、分布式事务 | Apache |
MyCat | 代理层 | 自动分表、IP白名单 | 社区驱动 |
Vitess | gRPC | 水平扩展、K8s集成 | YouTube |
ProxySQL | 代理层 | 查询缓存、连接池管理 | Percona |
某电商平台采用ShardingSphere的效果:
企业的数据库架构演进历程如下:
阶段 | TPS | 平均延迟 | 故障恢复时间 |
---|---|---|---|
单机 | 1,200 | 50ms | 2小时 |
读写分离 | 5,000 | 30ms | 30分钟 |
分库分表 | 20,000 | 15ms | 5分钟 |
单元化 | 50,000 | 8ms | 秒级切换 |
关系型数据库的高性能实践本质上是资源分配的艺术。从读写分离到分库分表,每个阶段都需要权衡:
最终建议:
遵循"演进式架构"理念,先通过读写分离应对初期压力,待业务规模明确后再实施分库分表,同时为未来可能的分布式架构预留扩展点。
关注 是对原创的最大认可,你的每一个关注 ,都是技术生态圈的+1节点!
开启通知,下一篇《架构设计之存储高性能——非关系型数据库》内容更新时,你就是技术圈最前沿的「极客」!