0%

golang库gorm中mysql分表的使用

1. 分表概念

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

也有一种策略是冷热分表。

1.1 分表策略

垂直分表: 将一张包含多个字段的表按照字段功能进行拆分,提高查询效率和减少冗余数据。

水平分表:按照数据的某个维度(如时间范围)进行拆分,将数据分散到多个表中,提高查询和写入性能。

1.2 分表算法

分片键是用来决定数据分布的依据,选择合适的分片键可以使数据均匀分布并提高查询性能。常见的分片键有用户 ID、时间戳等。

选定了分表键之后,经过算法处理后,得到的结果一定是一致的,不可变的。

通常情况下,当我们对 order 表进行分表的时候,比如我们要分成 128 张表的话,那么得到的 128 表应该是:order_0000、order_0001、order_0002…..order_0126、order_0127

2. Gorm 分表中间件

参考我的仓库: (https://github.com/unix2dos/sharding)

在gorm分表中间件的基础上,修改了以下问题。

2.1 使用

1
2
3
4
5
6
7
8
9
func main() {  
db, _ := gorm.Open()

tableConfigs := make(map[string]sharding.Config, 0)
tableConfigs["table_a"] = sharding.Config{ShardingKey: "user_id", NumberOfShards: 128, PrimaryKeyGenerator: sharding.PKSnowflake, DoubleWrite: true}
tableConfigs["table_b"] = sharding.Config{ShardingKey: "user_id", NumberOfShards: 128, PrimaryKeyGenerator: sharding.PKSnowflake, DoubleWrite: true}
tableConfigs["table_c"] = sharding.Config{ShardingKey: "user_id", NumberOfShards: 16, PrimaryKeyGenerator: sharding.PKSnowflake, DoubleWrite: true}
_ = db.Use(sharding.RegisterTablesConfigs(tableConfigs))
}

3. 参考资料

可以加首页作者微信,咨询相关问题!