1. 分库分表基础概念解析
在当今互联网应用中,数据量呈现爆炸式增长。以电商平台为例,一个中等规模的平台每天可能产生数百万条订单数据,一年下来单表数据量轻松突破亿级。传统单库单表架构在这种场景下会遇到严重的性能瓶颈,这正是分库分表技术应运而生的背景。
1.1 分库分表的核心原理
分库分表本质上是数据库的水平拆分技术,主要分为两种形式:
分库:将原本存储在单一数据库中的数据,按照特定规则分散到多个物理数据库中。例如,将用户数据按照用户ID的奇偶性分别存储到db0和db1两个数据库中。
分表:将单张数据表拆分为多张结构相同的表,每张表只存储部分数据。比如将user表拆分为user_0到user_3共4张表,每张表存储约25%的用户数据。
这两种方式可以单独使用,也可以组合使用。实际应用中,通常会同时采用分库和分表策略,以达到更好的扩展效果。
1.2 何时需要考虑分库分表
1.2.1 性能指标考量
-
数据量级:当单表数据量超过500万行时,查询性能开始明显下降;超过1000万行时,索引效率显著降低;超过5000万行时,常规优化手段收效甚微。
-
并发压力:当QPS(每秒查询量)超过单库处理能力时,表现为查询响应时间明显增加,连接数经常打满。
-
运维瓶颈:单表数据量过大导致备份恢复耗时过长,DDL操作锁表时间不可接受。
1.2.2 业务场景需求
-
微服务架构:各服务需要独立的数据存储,避免相互影响。
-
多租户系统:不同租户数据需要物理隔离,保证安全性和性能隔离。
-
全球化部署:不同地区用户访问本地数据库,降低网络延迟。
提示:不要过早优化!只有当监控数据明确显示单库单表成为瓶颈时,才应考虑引入分库分表。过早引入会增加系统复杂度,反而可能降低整体性能。
1.3 主流分片策略详解
1.3.1 水平分片策略
水平分片是按照数据行进行拆分的方式,常见策略包括:
| 策略类型 | 实现方式 | 适用场景 | 优缺点 |
|---|---|---|---|
| 取模分片 | user_id % 分片数 | 用户ID等离散值 | 简单均匀,但扩容困难 |
| 范围分片 | 按ID范围划分 | 有时间序列特征的数据 | 易于扩容,可能产生热点 |
| 哈希分片 | 对关键字段哈希 | 需要均匀分布的场景 | 分布均匀,不支持范围查询 |
| 时间分片 | 按时间维度划分 | 日志、订单等时间序列数据 | 符合业务特征,冷热数据分离 |
1.3.2 垂直分片策略
垂直分片是按照列进行拆分的方式,主要应用场景:
- 热点字段分离:将频繁访问的字段与不常访问的字段分开存储
- 大字段独立:将TEXT/BLOB等大字段单独存储
- 安全隔离:敏感字段与非敏感字段物理隔离
垂直分片虽然能解决部分性能问题,但通常不能根本解决单表数据量过大的问题,因此实践中多与水平分片结合使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring Boot集成ShardingSphere实战
Apache ShardingSphere是目前Java生态中最成熟的分布式数据库中间件之一,它提供了分库分表、读写分离、数据加密、分布式事务等一站式解决方案。
2.1 环境准备与依赖配置
2.1.1 项目依赖配置
在pom.xml中添加以下关键依赖:
xml复制<properties>
<shardingsphere.version>5.3.2</shardingsphere.version>
</properties>
<dependencies>
<!-- Spring Boot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- ShardingSphere JDBC核心 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- 分布式ID生成 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-sharding-algorithm-ext</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
</dependencies>
2.1.2 数据库准备
创建两个物理数据库db0和db1,每个数据库中创建相同
