管理杂谈OA答疑ERP答疑教程搜索

【C#】.NET 分表分库实战:原理、方案与代码落地


分表分库是解决单库数据量过大、查询性能瓶颈、高并发写入的核心方案,在 .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 后端架构升级、性能优化刚需


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn