EFCore.Sharding配置详解:自定义分表规则与全局设置最佳实践
【免费下载链接】EFCore.ShardingDatabase Sharding For EFCore项目地址: https://gitcode.com/gh_mirrors/ef/EFCore.Sharding
EFCore.Sharding是一款专为Entity Framework Core设计的数据库分表框架,通过灵活的分表规则配置和全局设置,帮助开发者轻松实现数据分片存储,提升系统性能和可扩展性。无论是哈希取模分表还是按时间范围分表,都能通过简单的API快速集成到现有项目中。
分表规则核心概念与类型
EFCore.Sharding提供两种主流分表策略,通过ShardingRule类实现规则定义,该类位于src/EFCore.Sharding/Primitives/ShardingRule.cs。
哈希取模分表(HashMod)
基于指定字段的哈希值进行取模运算,将数据均匀分布到多个表中。适用于数据访问频率均匀、无明显时间规律的场景。核心参数包括:
- ShardingField:分表字段名(如订单ID)
- Mod:分表数量,决定数据分布的表数量
日期分表(Date)
根据时间字段自动创建按时间范围划分的表(如按日、按月)。适用于具有明显时间序列特征的数据,如日志、订单记录等。核心参数包括:
- ExpandByDateMode:时间粒度(支持分钟、小时、日、月、年)
- ShardingField:日期类型的分表字段(如创建时间)
自定义分表规则配置步骤
1. 哈希取模分表配置
通过IShardingBuilder的SetHashModSharding方法配置,在启动时注册分表规则:
// 示例:对Order实体按Id字段进行3表哈希分表 services.AddEFCoreSharding(config => { config.SetHashModSharding<Order>(nameof(Order.Id), 3); });上述代码会将Order表按Id字段的哈希值取模3,分散到Order_0、Order_1、Order_2三个物理表中。实际项目中可参考examples/Demo.ModSharding/Program.cs的完整实现。
2. 日期分表配置
使用SetDateSharding方法配置时间范围分表,支持指定起始时间和时间粒度:
// 示例:对AuditLog按创建时间按月分表 var startTime = new DateTime(2023, 1, 1); services.AddEFCoreSharding(config => { config.SetDateSharding<AuditLog>( nameof(AuditLog.CreateTime), ExpandByDateMode.PerMonth, startTime ); });此配置会自动创建AuditLog_202301、AuditLog_202302等按月命名的物理表。详细示例可查看examples/Demo.DateSharding/Program.cs。
高级分表规则:多数据源与范围映射
多数据源分表
支持将不同范围的数据路由到不同数据源,通过传入范围数组实现:
// 示例:将Id 0-10000路由到SourceA,10001-20000路由到SourceB config.SetHashModSharding<Order>( nameof(Order.Id), 20000, (0, 10000, "SourceA"), (10001, 20000, "SourceB") );时间范围映射
对日期分表也支持多数据源配置,不同时间段的数据存储到不同数据库:
// 示例:2023年数据存储到Year2023库,2024年数据存储到Year2024库 config.SetDateSharding<AuditLog>( nameof(AuditLog.CreateTime), ExpandByDateMode.PerYear, (new DateTime(2023, 1, 1), new DateTime(2024, 1, 1), "Year2023"), (new DateTime(2024, 1, 1), DateTime.MaxValue, "Year2024") );全局设置最佳实践
1. 基础配置项
通过IShardingBuilder接口提供丰富的全局设置,核心配置包括:
| 方法 | 作用 | 示例 |
|---|---|---|
SetCommandTimeout | 设置SQL命令超时时间 | SetCommandTimeout(30) |
MigrationsWithoutForeignKey | 迁移时忽略外键 | MigrationsWithoutForeignKey() |
CreateShardingTableOnStarting | 启动时自动创建分表 | CreateShardingTableOnStarting(true) |
EnableShardingMigration | 启用分表迁移支持 | EnableShardingMigration(true) |
2. 逻辑删除配置
通过UseLogicDelete启用逻辑删除功能,自动过滤已删除数据:
// 示例:配置逻辑删除字段 config.UseLogicDelete( keyField: "Id", // 主键字段名 deletedField: "IsDeleted" // 逻辑删除标记字段 );3. 数据源配置
支持读写分离和多数据源配置,通过UseDatabase或AddDataSource方法注册数据源:
// 示例:配置主从分离数据源 config.UseDatabase( new[] { ("主库连接字符串", ReadWriteType.Write), ("从库1连接字符串", ReadWriteType.Read), ("从库2连接字符串", ReadWriteType.Read) }, DatabaseType.SqlServer );常见问题与解决方案
分表字段选择原则
- 哈希分表:选择分布均匀的字段(如自增ID、用户ID)
- 日期分表:必须使用
DateTime类型字段,建议选择数据写入的时间戳
分表数量规划
- 哈希分表:建议根据预估数据量设置,一般每个物理表控制在1000万行以内
- 日期分表:根据数据增长速度选择合适粒度(如日志表按日分表,订单表按月分表)
已有数据迁移
对于历史数据迁移,可使用src/EFCore.Sharding/Migrations/MigrationHelper.cs提供的工具类,实现数据平滑迁移到分表结构。
配置示例:完整启动流程
以下是一个包含分表规则和全局设置的完整配置示例:
var services = new ServiceCollection(); services.AddEFCoreSharding(config => { // 全局设置 config.SetCommandTimeout(30) .CreateShardingTableOnStarting(true) .EnableShardingMigration(true); // 分表规则配置 config.SetHashModSharding<Order>(nameof(Order.Id), 10) .SetDateSharding<OrderLog>( nameof(OrderLog.CreateTime), ExpandByDateMode.PerDay, new DateTime(2023, 1, 1) ); // 数据源配置 config.UseDatabase("连接字符串", DatabaseType.SqlServer); });通过以上配置,EFCore.Sharding将自动处理分表逻辑,开发者无需关心底层物理表结构,直接通过EF Core的常规API操作即可。更多配置细节可参考项目中的示例代码和src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs接口定义。
【免费下载链接】EFCore.ShardingDatabase Sharding For EFCore项目地址: https://gitcode.com/gh_mirrors/ef/EFCore.Sharding
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考