高级主题

分片

qianmoQqianmoQ· 更新于 2026-09-23· 阅读 4 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

分片插件使用 SQL 解析和替换将大表拆分为较小的表,并将查询重定向到分片表。为您提供高性能的数据库访问。

https://github.com/go-gorm/sharding

特性

  • 非侵入式设计。加载插件,指定配置,即可完成。
  • 速度极快。无基于网络的中间件,和 Go 一样快。
  • 支持多种数据库(PostgreSQL、MySQL)。
  • 内置主键生成器(Snowflake、PostgreSQL 序列、自定义等)。

使用方法

配置分片中间件,注册需要分片的表。有关配置详情,请参阅 Godoc。

import (
    "fmt"

    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/sharding"
)

db, err := gorm.Open(postgres.New(postgres.Config{DSN: "postgres://localhost:5432/sharding-db?sslmode=disable"}))

db.Use(sharding.Register(sharding.Config{
    ShardingKey:         "user_id",
    NumberOfShards:      64,
    PrimaryKeyGenerator: sharding.PKSnowflake,
}, "orders", Notification{}, AuditLog{}))

像平常一样使用 db session。但请注意,在操作分片表时,查询中必须包含 Sharding Key。


db.Create(&Order{UserID: 2})



db.Exec("INSERT INTO orders(user_id) VALUES(?)", int64(3))


db.Create(&Order{Amount: 10, ProductID: 100})
fmt.Println(err)


var orders []Order
db.Model(&Order{}).Where("user_id", int64(2)).Find(&orders)
fmt.Printf("%#v\n", orders)


db.Raw("SELECT * FROM orders WHERE user_id = ?", int64(3)).Scan(&orders)
fmt.Printf("%#v\n", orders)


err = db.Model(&Order{}).Where("product_id", "1").Find(&orders).Error
fmt.Println(err)


db.Exec("UPDATE orders SET product_id = ? WHERE user_id = ?", 2, int64(3))
err = db.Exec("DELETE FROM orders WHERE product_id = 3").Error
fmt.Println(err) 

完整示例请参见 这里。

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…