シャーディングプラグインは、巨大なテーブルを小さいテーブルに分割し、シャーディングテーブルにクエリをリダイレクトするために、SQLパーサーを使用してクエリを置き換えます。 高パフォーマンスなデータベスアクセスが可能となります。
https://github.com/go-gorm/sharding
特徴
- シンプルなデザイン。 プラグインをロードして設定を指定するだけで使用できます。
- 高速な動作。 Goと同じくらい速く、ネットワークに依存しないミドルウェア。
- 複数のデータベースのサポート。 PostgreSQLは動作検証済み、MySQLとSQLiteは今後追加されます。
- プライマリキージェネレータをカスタマイズできます(ビルトインのkeygen、Sequence、Snowflake…)
使用方法
シャーディングミドルウェアを設定し、シャーディング対象のテーブルを登録します。 See Godoc for config details.
import ( "fmt"
"gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/sharding" )
dsn := "postgres://localhost:5432/sharding-db?sslmode=disable" db, err := gorm.Open(postgres.New(postgres.Config{DSN: dsn}))
db.Use(sharding.Register(sharding.Config{ ShardingKey: "user_id", NumberOfShards: 64, PrimaryKeyGenerator: sharding.PKSnowflake, }, "orders").Register(sharding.Config{ ShardingKey: "user_id", NumberOfShards: 256, PrimaryKeyGenerator: sharding.PKSnowflake, }, Notification{}, AuditLog{}))
|
通常通りdbセッションを使用します。 シャーディング対象のテーブルを操作する場合は、クエリに 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)
|
より詳細な例は こちら にあります。