【C#】.NET 分表分库实战:原理、方案与代码落地
|
admin
2026年4月1日 15:43
本文热度 49
|
分表分库是解决单库数据量过大、查询性能瓶颈、高并发写入的核心方案,在 .NET 生态中,基于 ASP.NET Core + EF Core / SqlSugar / FreeSql 均可标准化落地,兼顾易用性与高性能。
一、分表分库核心场景与原则
1. 分表:单表数据超千万、查询变慢、索引失效,按规则拆成多张结构相同的表(同库内)。
2. 分库:单库连接数、磁盘、CPU 达到上限,按规则拆分到多个数据库实例。
3. 核心规则:
- 范围分片:按时间、ID 区间(适合日志、订单)
- 哈希分片:按用户ID/订单ID取模(适合均匀分布)
- 枚举分片:按区域、业务线拆分
二、.NET 主流分表分库框架
- SqlSugar:国内最易用,原生支持分表分库、读写分离,零入侵
- FreeSql:支持分表、分库、分布式事务
- EF Core + ShardingCore:国产开源,EF生态最强分片方案
- MyCat / ShardingSphere-Proxy:代理层分片,适配所有语言
三、SqlSugar 分表示例(最简落地)
// 1. 配置分表规则(按用户ID哈希分3张表)
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "conn",
DbType = DbType.MySql,
IsAutoCloseConnection = true
});
// 分表设置
db.SetSplitTable(o => o
.SplitType(SplitType.Hash)
.SplitInfo("user_id", 3) // 按user_id取模分3表
.CreateTable<Order>()); // 自动创建分表
// 2. 插入自动路由
await db.Insertable(new Order() { user_id = 1001, price = 99 }).SplitTable().ExecuteCommandAsync();
// 3. 查询自动路由
var list = await db.Queryable<Order>().Where(o => o.user_id == 1001).SplitTable().ToListAsync();
四、分库实现(多库路由)
// 配置多库连接
var db = new SqlSugarClient(new List<ConnectionConfig>()
{
new(){ ConfigId="db_0",ConnectionString="conn0",DbType=DbType.MySql },
new(){ ConfigId="db_1",ConnectionString="conn1",DbType=DbType.MySql }
});
// 按ID取模路由到对应库
var configId = "db_" + (user_id % 2);
var data = db.GetConnection(configId).Queryable<Order>().ToList();
五、分表分库关键注意事项
1. 分片键必须带在查询中,避免全表/全库扫描
2. 跨分片分页、排序、聚合需框架支持
3. 分布式事务:用最终一致性、Saga、TCC
4. 平滑扩容:优先双写+数据迁移,避免停机
5. 监控:慢查询、分片分布、连接数监控
六、适用场景总结
- 订单、用户、支付、日志等大数据量业务
- 高并发写入,单库扛不住
- .NET 后端架构升级、性能优化刚需
该文章在 2026/4/1 15:46:15 编辑过