Gorm Sharding 分表中间件教程
1、项目介绍
Gorm Sharding 是一个高性能的 Gorm 分表中间件,它基于 Conn 层做 SQL 拦截、AST 解析、分表路由、自增主键填充,带来的额外开销极小,对开发者友好、透明。使用上与普通 SQL、Gorm 查询无差别,只需要额外注意一下分表键条件,为您提供高性能的数据库访问。
项目地址:https://github.com/longbridgeapp/gorm-sharding
2、项目快速启动
安装
首先,确保你已经安装了 Go 和 Gorm。然后,通过以下命令安装 Gorm Sharding:
go get github.com/longbridgeapp/gorm-sharding
配置
以下是一个简单的配置示例,使用 PostgreSQL 数据库:
package main
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/sharding"
)
func main() {
dsn := "postgres://localhost:5432/sharding-db?sslmode=disable"
db, err := gorm.Open(postgres.New(postgres.Config{
DSN: dsn,
}), &gorm.Config{})
if err != nil {
panic(err)
}
// 配置 Sharding 中间件
db.Use(sharding.Register(sharding.Config{
ShardingKey: "user_id",
NumberOfShards: 4,
PrimaryKeyGenerator: sharding.PKSnowflake,
}, "orders"))
// 创建表
db.Exec(`CREATE TABLE IF NOT EXISTS orders_0 (
id SERIAL PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2)
)`)
db.Exec(`CREATE TABLE IF NOT EXISTS orders_1 (
id SERIAL PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2)
)`)
db.Exec(`CREATE TABLE IF NOT EXISTS orders_2 (
id SERIAL PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2)
)`)
db.Exec(`CREATE TABLE IF NOT EXISTS orders_3 (
id SERIAL PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2)
)`)
// 插入数据
db.Create(&Order{UserID: 1, Amount: 100.00})
db.Create(&Order{UserID: 2, Amount: 200.00})
// 查询数据
var orders []Order
db.Where("user_id = ?", 1).Find(&orders)
fmt.Println(orders)
}
type Order struct {
ID int
UserID int
Amount float64
}
3、应用案例和最佳实践
应用案例
假设你有一个电商系统,订单表数据量巨大,需要进行分表处理。使用 Gorm Sharding 可以轻松实现按用户 ID 分表,提高查询效率。
最佳实践
- 选择合适的分表键:选择一个能够均匀分布数据的字段作为分表键,如用户 ID、订单 ID 等。
- 合理设置分表数量:根据数据量和查询需求,合理设置分表数量,避免单表数据过大或过小。
- 主键生成策略:选择合适的主键生成策略,如 Snowflake、PostgreSQL Sequence 等。
4、典型生态项目
Gorm Sharding 可以与其他 Gorm 插件和生态项目结合使用,如:
- Gorm Logger:用于日志记录,方便调试和监控。
- Gorm Migrate:用于数据库迁移,管理数据库 schema。
- Gorm Prometheus:用于监控数据库性能指标。
通过这些生态项目的结合使用,可以构建一个完整、高效的数据库访问层。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



