前言
随着业务数据量爆发式增长,单库单表架构逐渐成为性能瓶颈。分库分表作为数据库水平扩展的核心方案,能有效提升系统吞吐量和存储能力。本文将结合Spring Boot与ShardingSphere,详细讲解分库分表的完整实现流程,通过实战案例演示分片策略配置、代码开发及高级特性,帮助开发者快速掌握分布式数据库设计核心技术。
一、分库分表核心概念与技术选型
1.1 为什么需要分库分表?
- 单库瓶颈:数据量超500万/单表体积超10GB时,查询性能显著下降
- 高并发挑战:单库连接数受限(默认151),写入性能瓶颈明显
- 扩展性需求:水平扩展比垂直升级更经济高效
1.2 ShardingSphere优势
- 无侵入性:基于JDBC接口,对业务代码零侵入
- 灵活分片:支持分片键、分片算法自定义
- 生态完善:支持读写分离、分布式事务、数据治理
- 性能优势:官方测试显示分片后吞吐量提升300%+
1.3 核心术语解析
- 逻辑表:分片后同一业务的虚拟表(如
t_order
) - 实际表:分片后的物理表(如
t_order_0
、t_order_1
) - 分片键:决定数据路由的关键字段(如
user_id
、order_id
) - 分片算法:定义数据路由规则(如取模、哈希、范围)
二、环境准备与基础配置
2.1 项目初始化
创建Spring Boot项目(2.7.10版本),添加核心依赖:
<!-- pom.xml -->
<dependencies>
<!-- Spring Boot基础 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ShardingSphere-JDBC -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.3.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
</dependencies>
2.2 数据库准备
创建2个数据库(db0
、db1
),每个库创建2张表(t_order_0
、t_order_1
):
-- 建库语句
CREATE DATABASE db0 CHARACTER SET utf8mb4;
CREATE DATABASE db1 CHARACTER SET utf8mb4;
-- 建表语句(每个库执行)
CREATE TABLE t_order_0 (
order_id BIGINT PRIMARY KEY COMMENT '订单ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
amount DECIMAL(10, 2) NOT NULL COMMENT '金额',
status VARCHAR(20) DEFAULT 'CREATED' COMMENT '订单状态',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB CHARSET=utf8mb4;
CREATE TABLE t_order_1 (
order_id BIGINT PRIM